]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Use __ehdr_start rather than _begin in _dl_start_final
authorAlan Modra <amodra@gmail.com>
Wed, 27 Apr 2022 05:09:10 +0000 (14:39 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 27 Apr 2022 23:20:11 +0000 (08:50 +0930)
__ehdr_start is already used in rltld.c:dl_main, and can serve the
same purpose as _begin.  Besides tidying the code, using linker
defined section relative symbols rather than "-defsym _begin=0" better
reflects the intent of _dl_start_final use of _begin, which is to
refer to the load address of ld.so rather than absolute address zero.

Reviewed-by: Florian Weimer <fweimer@redhat.com>
elf/Makefile
elf/rtld.c

index 80e8552c59421c3c05428a16aff2332505cdff82..fc9860edeec8ee86b8e40ae0ca1a50529ced65f9 100644 (file)
@@ -1336,8 +1336,7 @@ $(objpfx)ld.so: $(objpfx)librtld.os $(ld-map)
        $(LINK.o) -nostdlib -nostartfiles -shared -o $@.new             \
                  $(LDFLAGS-rtld) -Wl,-z,defs $(z-now-$(bind-now))      \
                  $(filter-out $(map-file),$^) $(load-map-file)         \
-                 -Wl,-soname=$(rtld-installed-name)                    \
-                 -Wl,-defsym=_begin=0
+                 -Wl,-soname=$(rtld-installed-name)
        $(call after-link,$@.new)
        $(READELF) -s $@.new \
          | $(AWK) '($$7 ~ /^UND(|EF)$$/ && $$1 != "0:" && $$4 != "REGISTER") { print; p=1 } END { exit p != 0 }'
index be6daa1c4432f379a77e19fd76a13e491fe6de75..3b2e05bf4c3ae129063cf3f54b14dbdaaaa23064 100644 (file)
@@ -440,8 +440,8 @@ static ElfW(Addr) _dl_start_final (void *arg,
                                   struct dl_start_final_info *info);
 #endif
 
-/* These defined magically in the linker script.  */
-extern char _begin[] attribute_hidden;
+/* These are defined magically by the linker.  */
+extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
 extern char _etext[] attribute_hidden;
 extern char _end[] attribute_hidden;
 
@@ -490,7 +490,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
 #endif
   _dl_setup_hash (&GL(dl_rtld_map));
   GL(dl_rtld_map).l_real = &GL(dl_rtld_map);
-  GL(dl_rtld_map).l_map_start = (ElfW(Addr)) _begin;
+  GL(dl_rtld_map).l_map_start = (ElfW(Addr)) &__ehdr_start;
   GL(dl_rtld_map).l_map_end = (ElfW(Addr)) _end;
   GL(dl_rtld_map).l_text_end = (ElfW(Addr)) _etext;
   /* Copy the TLS related data if necessary.  */
@@ -1741,7 +1741,6 @@ dl_main (const ElfW(Phdr) *phdr,
      segment that also includes the phdrs.  If that's not available, we use
      the old method that assumes the beginning of the file is part of the
      lowest-addressed PT_LOAD segment.  */
-  extern const ElfW(Ehdr) __ehdr_start __attribute__ ((visibility ("hidden")));
 
   /* Set up the program header information for the dynamic linker
      itself.  It is needed in the dl_iterate_phdr callbacks.  */