OSDN Git Service

Scrub up use of ELF_USES_RELOCA and eliminte some unsightly ifdefs
authorEric Andersen <andersen@codepoet.org>
Thu, 29 Jan 2004 11:42:46 +0000 (11:42 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 29 Jan 2004 11:42:46 +0000 (11:42 -0000)
ldso/include/dl-elf.h
ldso/include/ld_elf.h
ldso/include/ldso.h
ldso/ldso/dl-elf.c
ldso/ldso/ldso.c
ldso/ldso/readelflib1.c

index 7ae1591..4a14884 100644 (file)
@@ -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) | \
index 7ae1591..4a14884 100644 (file)
@@ -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) | \
index 81ae78d..621236f 100644 (file)
 #  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
+
index fb7eacc..4b6d75d 100644 (file)
@@ -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;
 }
 
index 8d5d08e..f563a57 100644 (file)
@@ -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;
index fb7eacc..4b6d75d 100644 (file)
@@ -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;
 }