diff options
-rw-r--r-- | Makeconfig | 13 | ||||
-rwxr-xr-x | configure | 16 | ||||
-rw-r--r-- | configure.ac | 11 | ||||
-rw-r--r-- | elf/Makefile | 3 | ||||
-rw-r--r-- | elf/rtld.c | 6 |
5 files changed, 48 insertions, 1 deletions
diff --git a/Makeconfig b/Makeconfig index 208fd3ddde..ba00331fb8 100644 --- a/Makeconfig +++ b/Makeconfig @@ -521,8 +521,13 @@ CFLAGS-printers-tests := -O0 -ggdb3 -DIS_IN_build ifeq (yes,$(build-shared)) # These indicate whether to link using the built ld.so or the installed one. +ifeq ($(with-lld),no) installed-rtld-LDFLAGS = -Wl,-dynamic-linker=$(rtlddir)/$(rtld-installed-name) built-rtld-LDFLAGS = -Wl,-dynamic-linker=$(elf-objpfx)ld.so +else +installed-rtld-LDFLAGS = -Wl,-dynamic-linker,$(rtlddir)/$(rtld-installed-name) +built-rtld-LDFLAGS = -Wl,-dynamic-linker,$(elf-objpfx)ld.so +endif ifndef rtld-LDFLAGS rtld-LDFLAGS = $(installed-rtld-LDFLAGS) @@ -912,7 +917,15 @@ ifeq ($(with-clang),yes) # Non-string format arguments come from debugging prints in ld.so. +cflags += -Wno-format-security +# Is this still needed? +cflags += -no-integrated-as + +ifeq ($(with-lld),yes) +LDFLAGS.so += -fuse-ld=lld +LDFLAGS-rtld += -fuse-ld=lld +LDFLAGS += -fuse-ld=lld +endif + endif # with-clang == yes +cflags += $(cflags-cpu) $(+gccwarn) $(+merge-constants) $(+math-flags) \ diff --git a/configure b/configure index 490d85c0a8..9dc8c5f253 100755 --- a/configure +++ b/configure @@ -765,6 +765,7 @@ with_gd_lib with_binutils with_selinux with_clang +with_lld with_headers with_default_link with_nonshared_cflags @@ -1499,6 +1500,7 @@ Optional Packages: --with-binutils=PATH specify location of binutils (as and ld) --with-selinux if building with SELinux support --with-clang if building with clang (temporary) + --with-lld if building/linking with lld (temporary) --with-headers=PATH location of system headers to use (for example /usr/src/linux/include) [default=compiler default] --with-default-link do not use explicit linker scripts @@ -3351,6 +3353,16 @@ fi config_vars="$config_vars with-clang = $with_clang" +# Check whether --with-lld was given. +if test "${with_lld+set}" = set; then : + withval=$with_lld; with_lld=$withval +else + with_lld=no +fi + +config_vars="$config_vars +with-lld = $with_lld" + # Check whether --with-headers was given. if test "${with_headers+set}" = set; then : @@ -4575,6 +4587,7 @@ $as_echo "$libc_cv_prog_ld_gnu" >&6; } gnu_ld=$libc_cv_prog_ld_gnu +if test "$with_clang" = no; then # Accept binutils 2.25 or newer. for ac_prog in $AS do @@ -4639,7 +4652,9 @@ if test $ac_verc_fail = yes; then AS=: critic_missing="$critic_missing as" fi +fi +if test "$with_lld" = no; then if test -n "`$LD --version | sed -n 's/^GNU \(gold\).*$/\1/p'`"; then # Accept gold 1.14 or higher for ac_prog in $LD @@ -4770,6 +4785,7 @@ if test $ac_verc_fail = yes; then fi fi +fi # These programs are version sensitive. diff --git a/configure.ac b/configure.ac index 8907900b31..225f68f1a9 100644 --- a/configure.ac +++ b/configure.ac @@ -144,6 +144,13 @@ AC_ARG_WITH([clang], [with_clang=$withval], [with_clang=no]) LIBC_CONFIG_VAR([with-clang], [$with_clang]) +dnl This is a temporary hack, to help with BFD LD vs LLD debugging. +AC_ARG_WITH([lld], + AC_HELP_STRING([--with-lld], + [if building/linking with lld (temporary)]), + [with_lld=$withval], + [with_lld=no]) +LIBC_CONFIG_VAR([with-lld], [$with_lld]) AC_ARG_WITH([headers], AC_HELP_STRING([--with-headers=PATH], @@ -995,12 +1002,15 @@ AC_PROG_LN_S LIBC_PROG_BINUTILS +if test "$with_clang" = no; then # Accept binutils 2.25 or newer. AC_CHECK_PROG_VER(AS, $AS, --version, [GNU assembler.* \([0-9]*\.[0-9.]*\)], [2.1[0-9][0-9]*|2.2[5-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*], AS=: critic_missing="$critic_missing as") +fi +if test "$with_lld" = no; then if test -n "`$LD --version | sed -n 's/^GNU \(gold\).*$/\1/p'`"; then # Accept gold 1.14 or higher AC_CHECK_PROG_VER(LD, $LD, --version, @@ -1013,6 +1023,7 @@ else [2.1[0-9][0-9]*|2.2[5-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*], LD=: critic_missing="$critic_missing GNU ld") fi +fi # These programs are version sensitive. AC_CHECK_TOOL_PREFIX diff --git a/elf/Makefile b/elf/Makefile index 9cf5cd8dfd..2d7162d3cc 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -458,9 +458,10 @@ $(objpfx)librtld.map: $(objpfx)dl-allobjs.os $(common-objpfx)libc_pic.a rm -f $@.o mv -f $@T $@ +# For lld, add to regexp below for optional address and size to be at front of line. $(objpfx)librtld.mk: $(objpfx)librtld.map Makefile LC_ALL=C \ - sed -n 's@^$(common-objpfx)\([^(]*\)(\([^)]*\.os\)) *.*$$@\1 \2@p' \ + sed -n 's@^[0-9a-f ]*$(common-objpfx)\([^(]*\)(\([^)]*\.os\)) *.*$$@\1 \2@p' \ $< | \ while read lib file; do \ case $$lib in \ diff --git a/elf/rtld.c b/elf/rtld.c index 631021d73e..c1443cba7d 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -393,7 +393,13 @@ _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); +#if defined(__clang__) + /* Work around an lld complaint that _begin cannot have a reloc and + also be absolute because of _begin=0 on linker line. */ + GL(dl_rtld_map).l_map_start = (ElfW(Addr)) 0; +#else GL(dl_rtld_map).l_map_start = (ElfW(Addr)) _begin; +#endif 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. */ |