mirror of https://gitee.com/openkylin/linux.git
x86/vdso: Error out in vdso2c if DT_RELA is present
vdso2c was checking for various types of relocations to detect when the vdso had undefined symbols or was otherwise dependent on relocation at load time. Undefined symbols in the vdso would fail if accessed at runtime, and certain implementation errors (e.g. branch profiling or incorrect symbol visibilities) could result in data access through the GOT that requires relocations. This could be as simple as: extern char foo; return foo; Without some kind of visibility control, the compiler would assume that foo could be interposed at load time and would generate a relocation. x86-64 and x32 (as opposed to i386) use explicit-addent (RELA) instead of implicit-addent (REL) relocations for data access, and vdso2c forgot to detect those. Whether these bad relocations would actually fail at runtime depends on what the linker sticks in the unrelocated references. Nonetheless, these relocations have no business existing in the vDSO and should be fixed rather than silently ignored. This error could trigger on some configurations due to branch profiling. The previous patch fixed that. Signed-off-by: Andy Lutomirski <luto@amacapital.net> Link: http://lkml.kernel.org/r/74ef0c00b4d2a3b573e00a4113874e62f772e348.1403642755.git.luto@amacapital.net Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
parent
46b57a7693
commit
6a89d71078
|
@ -164,7 +164,7 @@ static void BITSFUNC(go)(void *addr, size_t len,
|
|||
for (i = 0; dyn + i < dyn_end &&
|
||||
GET_LE(&dyn[i].d_tag) != DT_NULL; i++) {
|
||||
typeof(dyn[i].d_tag) tag = GET_LE(&dyn[i].d_tag);
|
||||
if (tag == DT_REL || tag == DT_RELSZ ||
|
||||
if (tag == DT_REL || tag == DT_RELSZ || tag == DT_RELA ||
|
||||
tag == DT_RELENT || tag == DT_TEXTREL)
|
||||
fail("vdso image contains dynamic relocations\n");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue