diff options
-rw-r--r-- | ldso/include/dl-elf.h | 9 | ||||
-rw-r--r-- | ldso/include/ld_elf.h | 9 | ||||
-rw-r--r-- | ldso/include/ldso.h | 15 | ||||
-rw-r--r-- | ldso/ldso/dl-elf.c | 68 | ||||
-rw-r--r-- | ldso/ldso/ldso.c | 11 | ||||
-rw-r--r-- | ldso/ldso/readelflib1.c | 68 |
6 files changed, 87 insertions, 93 deletions
diff --git a/ldso/include/dl-elf.h b/ldso/include/dl-elf.h index 7ae1591c2..4a1488432 100644 --- a/ldso/include/dl-elf.h +++ b/ldso/include/dl-elf.h @@ -77,11 +77,20 @@ extern int _dl_linux_resolve(void); */ #ifdef ELF_USES_RELOCA # define ELF_RELOC ElfW(Rela) +# define DT_RELOC_TABLE_ADDR DT_RELA +# define DT_RELOC_TABLE_SIZE DT_RELASZ +# define UNSUPPORTED_RELOC_TYPE DT_REL +# define UNSUPPORTED_RELOC_STR "REL" #else # define ELF_RELOC ElfW(Rel) +# define DT_RELOC_TABLE_ADDR DT_REL +# define DT_RELOC_TABLE_SIZE DT_RELSZ +# define UNSUPPORTED_RELOC_TYPE DT_RELA +# define UNSUPPORTED_RELOC_STR "RELA" #endif + /* Convert between the Linux flags for page protections and the ones specified in the ELF standard. */ #define LXFLAGS(X) ( (((X) & PF_R) ? PROT_READ : 0) | \ diff --git a/ldso/include/ld_elf.h b/ldso/include/ld_elf.h index 7ae1591c2..4a1488432 100644 --- a/ldso/include/ld_elf.h +++ b/ldso/include/ld_elf.h @@ -77,11 +77,20 @@ extern int _dl_linux_resolve(void); */ #ifdef ELF_USES_RELOCA # define ELF_RELOC ElfW(Rela) +# define DT_RELOC_TABLE_ADDR DT_RELA +# define DT_RELOC_TABLE_SIZE DT_RELASZ +# define UNSUPPORTED_RELOC_TYPE DT_REL +# define UNSUPPORTED_RELOC_STR "REL" #else # define ELF_RELOC ElfW(Rel) +# define DT_RELOC_TABLE_ADDR DT_REL +# define DT_RELOC_TABLE_SIZE DT_RELSZ +# define UNSUPPORTED_RELOC_TYPE DT_RELA +# define UNSUPPORTED_RELOC_STR "RELA" #endif + /* Convert between the Linux flags for page protections and the ones specified in the ELF standard. */ #define LXFLAGS(X) ( (((X) & PF_R) ? PROT_READ : 0) | \ diff --git a/ldso/include/ldso.h b/ldso/include/ldso.h index 81ae78d2b..621236fdf 100644 --- a/ldso/include/ldso.h +++ b/ldso/include/ldso.h @@ -15,3 +15,18 @@ # define PAGE_SHIFT 12 # define PAGE_SIZE (1UL << PAGE_SHIFT) #endif + +/* Prepare for the case that `__builtin_expect' is not available. */ +#if __GNUC__ == 2 && __GNUC_MINOR__ < 96 +#define __builtin_expect(x, expected_value) (x) +#endif +#ifndef likely +# define likely(x) __builtin_expect((!!(x)),1) +#endif +#ifndef unlikely +# define unlikely(x) __builtin_expect((!!(x)),0) +#endif +#ifndef __LINUX_COMPILER_H +#define __LINUX_COMPILER_H +#endif + diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c index fb7eacc12..4b6d75d7a 100644 --- a/ldso/ldso/dl-elf.c +++ b/ldso/ldso/dl-elf.c @@ -874,74 +874,58 @@ int _dl_fixup(struct dyn_elf *rpnt, int flag) tpnt = rpnt->dyn; #if defined (__SUPPORT_LD_DEBUG__) - if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); -#endif - - if (tpnt->dynamic_info[DT_REL]) { -#ifdef ELF_USES_RELOCA -#if defined (__SUPPORT_LD_DEBUG__) - if(_dl_debug) _dl_dprintf(2, "%s: can't handle REL relocation records\n", _dl_progname); -#endif - goof++; - return goof; -#else - if (tpnt->init_flag & RELOCS_DONE) - return goof; - tpnt->init_flag |= RELOCS_DONE; - goof += _dl_parse_relocation_information(tpnt, - tpnt->dynamic_info[DT_REL], - tpnt->dynamic_info[DT_RELSZ], 0); + if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); #endif - } - if (tpnt->dynamic_info[DT_RELA]) { -#ifndef ELF_USES_RELOCA + + if (unlikely(tpnt->dynamic_info[UNSUPPORTED_RELOC_TYPE])) { #if defined (__SUPPORT_LD_DEBUG__) - if(_dl_debug) _dl_dprintf(2, "%s: can't handle RELA relocation records\n", _dl_progname); -#endif + if(_dl_debug) { + _dl_dprintf(2, "%s: can't handle %s relocation records\n", + _dl_progname, UNSUPPORTED_RELOC_STR); + } +#endif goof++; return goof; -#else + } + + if (tpnt->dynamic_info[DT_RELOC_TABLE_ADDR]) { if (tpnt->init_flag & RELOCS_DONE) return goof; tpnt->init_flag |= RELOCS_DONE; - goof += _dl_parse_relocation_information(tpnt, - tpnt->dynamic_info[DT_RELA], - tpnt->dynamic_info[DT_RELASZ], 0); -#endif + goof += _dl_parse_relocation_information(tpnt, + tpnt->dynamic_info[DT_RELOC_TABLE_ADDR], + tpnt->dynamic_info[DT_RELOC_TABLE_SIZE], 0); } + if (tpnt->dynamic_info[DT_JMPREL]) { if (tpnt->init_flag & JMP_RELOCS_DONE) return goof; tpnt->init_flag |= JMP_RELOCS_DONE; if (flag & RTLD_LAZY) { - _dl_parse_lazy_relocation_information(tpnt, - tpnt->dynamic_info[DT_JMPREL], + _dl_parse_lazy_relocation_information(tpnt, + tpnt->dynamic_info[DT_JMPREL], tpnt->dynamic_info [DT_PLTRELSZ], 0); } else { - goof += _dl_parse_relocation_information(tpnt, - tpnt->dynamic_info[DT_JMPREL], + goof += _dl_parse_relocation_information(tpnt, + tpnt->dynamic_info[DT_JMPREL], tpnt->dynamic_info[DT_PLTRELSZ], 0); } } + if (tpnt->init_flag & COPY_RELOCS_DONE) return goof; tpnt->init_flag |= COPY_RELOCS_DONE; -#ifdef ELF_USES_RELOCA - goof += _dl_parse_copy_information(rpnt, - tpnt->dynamic_info[DT_RELA], tpnt->dynamic_info[DT_RELASZ], 0); - -#else - goof += _dl_parse_copy_information(rpnt, tpnt->dynamic_info[DT_REL], - tpnt->dynamic_info[DT_RELSZ], 0); - -#endif + goof += _dl_parse_copy_information(rpnt, + tpnt->dynamic_info[DT_RELOC_TABLE_ADDR], + tpnt->dynamic_info[DT_RELOC_TABLE_SIZE], 0); #if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug) { - _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); + _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); _dl_dprintf(_dl_debug_file,"; finished\n\n"); } -#endif +#endif + return goof; } diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index 8d5d08e1e..f563a570a 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -565,17 +565,10 @@ LD_BOOT(unsigned long args) unsigned long rel_addr, rel_size; -#ifdef ELF_USES_RELOCA rel_addr = (indx ? tpnt->dynamic_info[DT_JMPREL] : tpnt-> - dynamic_info[DT_RELA]); + dynamic_info[DT_RELOC_TABLE_ADDR]); rel_size = (indx ? tpnt->dynamic_info[DT_PLTRELSZ] : tpnt-> - dynamic_info[DT_RELASZ]); -#else - rel_addr = (indx ? tpnt->dynamic_info[DT_JMPREL] : tpnt-> - dynamic_info[DT_REL]); - rel_size = (indx ? tpnt->dynamic_info[DT_PLTRELSZ] : tpnt-> - dynamic_info[DT_RELSZ]); -#endif + dynamic_info[DT_RELOC_TABLE_SIZE]); if (!rel_addr) continue; diff --git a/ldso/ldso/readelflib1.c b/ldso/ldso/readelflib1.c index fb7eacc12..4b6d75d7a 100644 --- a/ldso/ldso/readelflib1.c +++ b/ldso/ldso/readelflib1.c @@ -874,74 +874,58 @@ int _dl_fixup(struct dyn_elf *rpnt, int flag) tpnt = rpnt->dyn; #if defined (__SUPPORT_LD_DEBUG__) - if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); -#endif - - if (tpnt->dynamic_info[DT_REL]) { -#ifdef ELF_USES_RELOCA -#if defined (__SUPPORT_LD_DEBUG__) - if(_dl_debug) _dl_dprintf(2, "%s: can't handle REL relocation records\n", _dl_progname); -#endif - goof++; - return goof; -#else - if (tpnt->init_flag & RELOCS_DONE) - return goof; - tpnt->init_flag |= RELOCS_DONE; - goof += _dl_parse_relocation_information(tpnt, - tpnt->dynamic_info[DT_REL], - tpnt->dynamic_info[DT_RELSZ], 0); + if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); #endif - } - if (tpnt->dynamic_info[DT_RELA]) { -#ifndef ELF_USES_RELOCA + + if (unlikely(tpnt->dynamic_info[UNSUPPORTED_RELOC_TYPE])) { #if defined (__SUPPORT_LD_DEBUG__) - if(_dl_debug) _dl_dprintf(2, "%s: can't handle RELA relocation records\n", _dl_progname); -#endif + if(_dl_debug) { + _dl_dprintf(2, "%s: can't handle %s relocation records\n", + _dl_progname, UNSUPPORTED_RELOC_STR); + } +#endif goof++; return goof; -#else + } + + if (tpnt->dynamic_info[DT_RELOC_TABLE_ADDR]) { if (tpnt->init_flag & RELOCS_DONE) return goof; tpnt->init_flag |= RELOCS_DONE; - goof += _dl_parse_relocation_information(tpnt, - tpnt->dynamic_info[DT_RELA], - tpnt->dynamic_info[DT_RELASZ], 0); -#endif + goof += _dl_parse_relocation_information(tpnt, + tpnt->dynamic_info[DT_RELOC_TABLE_ADDR], + tpnt->dynamic_info[DT_RELOC_TABLE_SIZE], 0); } + if (tpnt->dynamic_info[DT_JMPREL]) { if (tpnt->init_flag & JMP_RELOCS_DONE) return goof; tpnt->init_flag |= JMP_RELOCS_DONE; if (flag & RTLD_LAZY) { - _dl_parse_lazy_relocation_information(tpnt, - tpnt->dynamic_info[DT_JMPREL], + _dl_parse_lazy_relocation_information(tpnt, + tpnt->dynamic_info[DT_JMPREL], tpnt->dynamic_info [DT_PLTRELSZ], 0); } else { - goof += _dl_parse_relocation_information(tpnt, - tpnt->dynamic_info[DT_JMPREL], + goof += _dl_parse_relocation_information(tpnt, + tpnt->dynamic_info[DT_JMPREL], tpnt->dynamic_info[DT_PLTRELSZ], 0); } } + if (tpnt->init_flag & COPY_RELOCS_DONE) return goof; tpnt->init_flag |= COPY_RELOCS_DONE; -#ifdef ELF_USES_RELOCA - goof += _dl_parse_copy_information(rpnt, - tpnt->dynamic_info[DT_RELA], tpnt->dynamic_info[DT_RELASZ], 0); - -#else - goof += _dl_parse_copy_information(rpnt, tpnt->dynamic_info[DT_REL], - tpnt->dynamic_info[DT_RELSZ], 0); - -#endif + goof += _dl_parse_copy_information(rpnt, + tpnt->dynamic_info[DT_RELOC_TABLE_ADDR], + tpnt->dynamic_info[DT_RELOC_TABLE_SIZE], 0); #if defined (__SUPPORT_LD_DEBUG__) if(_dl_debug) { - _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); + _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); _dl_dprintf(_dl_debug_file,"; finished\n\n"); } -#endif +#endif + return goof; } |