diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2012-11-14 09:45:32 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2012-11-14 09:45:32 -0800 |
commit | 6dda64cb46cc42c41b7472233c61867b8218d1f5 (patch) | |
tree | c20dfd076d825686dc8194eba34916903375a3fa | |
parent | c485e4d2cce71139eb914797d862bf6d373a4684 (diff) | |
download | glibc-6dda64cb46cc42c41b7472233c61867b8218d1f5.tar.gz |
Skip audit if l_reloc_result is NULL
-rw-r--r-- | ChangeLog.hjl | 12 | ||||
-rw-r--r-- | elf/Makefile | 6 | ||||
-rw-r--r-- | elf/dl-runtime.c | 19 | ||||
-rw-r--r-- | elf/tst-audit8.c | 1 |
4 files changed, 37 insertions, 1 deletions
diff --git a/ChangeLog.hjl b/ChangeLog.hjl new file mode 100644 index 0000000000..29722f27b0 --- /dev/null +++ b/ChangeLog.hjl @@ -0,0 +1,12 @@ +2012-11-13 H.J. Lu <hongjiu.lu@intel.com> + + [BZ #14831] + * elf/Makefile (tests): Add tst-audit8. + ($(objpfx)tst-audit8): Also depend on $(common-objpfx)math/libm.so. + ($(objpfx)tst-audit8.out): New target. + (tst-audit8-ENV): New variable. + * elf/dl-runtime.c (_dl_profile_fixup): Call _dl_fixup to skip + audit if l_reloc_result is NULL. + (ELF_MACHINE_RUNTIME_FIXUP_PARAMS): Issue an error if it isn't + defined and ELF_MACHINE_RUNTIME_FIXUP_ARGS is defined. + * elf/tst-audit8.c: New file. diff --git a/elf/Makefile b/elf/Makefile index c2f0e2058f..7e5c9c87e9 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -142,7 +142,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ tst-dlmodcount tst-dlopenrpath tst-deep1 \ tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \ unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \ - tst-audit1 tst-audit2 \ + tst-audit1 tst-audit2 tst-audit8 \ tst-stackguard1 tst-addr1 tst-thrlock \ tst-unique1 tst-unique2 tst-unique3 tst-unique4 \ tst-initorder tst-initorder2 tst-relsort1 @@ -1020,6 +1020,10 @@ $(objpfx)tst-audit7: $(objpfx)tst-auditmod7a.so $(objpfx)tst-audit7.out: $(objpfx)tst-auditmod7b.so tst-audit7-ENV = LD_AUDIT=$(objpfx)tst-auditmod7b.so +$(objpfx)tst-audit8: $(common-objpfx)math/libm.so +$(objpfx)tst-audit8.out: $(objpfx)tst-auditmod1.so +tst-audit8-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so + $(objpfx)tst-global1: $(libdl) $(objpfx)tst-global1.out: $(objpfx)testobj6.so $(objpfx)testobj2.so diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c index 2e02a218e6..c4c57c2e58 100644 --- a/elf/dl-runtime.c +++ b/elf/dl-runtime.c @@ -164,6 +164,25 @@ _dl_profile_fixup ( { void (*mcount_fct) (ElfW(Addr), ElfW(Addr)) = INTUSE(_dl_mcount); + if (l->l_reloc_result == NULL) + { + /* Resolve an IRELATIVE relocation in another DSO may reference a + function defined in libc.so before l_reloc_result is allocated. + For example, __get_cpu_features in libc.so is called to resolve + R_X86_64_IRELATIVE relocations in x86-64 libm.so. Skip audit and + resolve the function in this case. It is OK since we aren't + supposed to audit IRELATIVE relocations. */ + *framesizep = -1; + return _dl_fixup ( +# ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS +# ifndef ELF_MACHINE_RUNTIME_FIXUP_PARAMS +# error Please define ELF_MACHINE_RUNTIME_FIXUP_PARAMS. +# endif + ELF_MACHINE_RUNTIME_FIXUP_PARAMS, +# endif + l, reloc_arg); + } + /* This is the address in the array where we store the result of previous relocations. */ struct reloc_result *reloc_result = &l->l_reloc_result[reloc_index]; diff --git a/elf/tst-audit8.c b/elf/tst-audit8.c new file mode 100644 index 0000000000..63656b4ee9 --- /dev/null +++ b/elf/tst-audit8.c @@ -0,0 +1 @@ +#include "../io/pwd.c" |