Added AIX-ld support for DSO.
authordrepper <drepper>
Wed, 20 Jun 2001 07:00:23 +0000 (07:00 +0000)
committerdrepper <drepper>
Wed, 20 Jun 2001 07:00:23 +0000 (07:00 +0000)
Makeconfig
Makerules

index 26884f8..3b9f62f 100644 (file)
@@ -423,6 +423,7 @@ endif
 endif
 ifndef link-libc
 ifeq (yes,$(build-shared))
+ifeq ($(elf),yes)
 # We need the versioned name of libc.so in the deps of $(others) et al
 # so that the symlink to libc.so is created before anything tries to
 # run the linked programs.
@@ -431,6 +432,13 @@ link-libc = -Wl,-rpath-link=$(rpath-link) \
            $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
 # This is how to find at build-time things that will be installed there.
 rpath-dirs = math elf dlfcn nss nis rt resolv crypt
+else
+ifneq (,$(findstring aix,$(config-os)))
+link-libc = $(common-objpfx)libc.so \
+           $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
+rpath-dirs = math dlfcn nss nis rt resolv crypt
+endif
+endif
 rpath-link = \
 $(common-objdir):$(subst $(empty) ,:,$(patsubst ../$(subdir),.,$(rpath-dirs:%=$(common-objpfx)%)))
 elfobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)elf)
@@ -441,6 +449,21 @@ link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a
 endif
 endif
 
+# Differences in the linkers on the various platforms.
+ifeq ($(elf),yes)
+LDFLAGS-rpath-ORIGIN = -Wl,-rpath,'$$ORIGIN'
+LDFLAGS-soname-fname = -Wl,-soname,$(@F)
+LDFLAGS-rdynamic = -rdynamic
+LDFLAGS-Bsymbolic = -Bsymbolic
+else
+ifneq (,$(findstring aix,$(config-os)))
+LDFLAGS-rpath-ORIGIN =
+LDFLAGS-soname-fname =
+LDFLAGS-rdynamic = -Wl,-bdynamic
+LDFLAGS-Bsymbolic = -Wl,-bsymbolic
+endif
+endif
+
 # Choose the default search path for the dynamic linker based on
 # where we will install libraries.
 ifneq ($(libdir),$(slibdir))
@@ -493,7 +516,7 @@ elf-objpfx = $(common-objpfx)elf/
 # How to run a program we just linked with our library.
 # The program binary is assumed to be $(word 2,$^).
 built-program-file = $(dir $(word 2,$^))$(notdir $(word 2,$^))
-ifeq (yes,$(build-shared))
+ifeq (yesyes,$(build-shared)$(elf))
 comma = ,
 sysdep-library-path = \
 $(subst $(empty) ,:,$(strip $(patsubst -Wl$(comma)-rpath-link=%, %,\
@@ -758,6 +781,13 @@ postclean-generated += soversions.mk
 before-compile += $(common-objpfx)gnu/lib-names.h
 ifeq ($(soversions.mk-done),t)
 $(common-objpfx)gnu/lib-names.h: $(common-objpfx)gnu/lib-names.stmp; @:
+ifneq (,$(findstring aix,$(config-os)))
+$(common-objpfx)gnu/lib-names.stmp: $(..)sysdeps/unix/sysv/aix/gnu/lib-names.h
+       $(make-target-directory)
+       @rm -f ${@:stmp=T} $@
+       @cp $(..)sysdeps/unix/sysv/aix/gnu/lib-names.h $(common-objpfx)gnu
+       touch $@
+else
 $(common-objpfx)gnu/lib-names.stmp: $(common-objpfx)soversions.mk
        $(make-target-directory)
        @rm -f ${@:stmp=T} $@
@@ -786,6 +816,7 @@ $(common-objpfx)gnu/lib-names.stmp: $(common-objpfx)soversions.mk
        $(move-if-change) ${@:stmp=T} ${@:stmp=h}
        touch $@
 endif
+endif
 
 common-generated += gnu/lib-names.h gnu/lib-names.stmp
 
@@ -815,10 +846,21 @@ else
 libdl = $(common-objpfx)dlfcn/libdl.a
 endif
 else
-# No ELF - no libdl, at least for now.
+ifneq (,$(findstring aix,$(config-os)))
+ifeq ($(build-shared),yes)
+dlfcn = dlfcn
+libdl = $(common-objpfx)dlfcn/libdl.so$(libdl.so-version)
+else
+# No libdl without shared libs on AIX
+dlfcn =
+libdl =
+endif
+else
+# No ELF, no AIX - no libdl, at least for now.
 dlfcn =
 libdl =
 endif
+endif
 
 # These are the subdirectories containing the library source.  The order
 # is more or less arbitrary.  The sorting step will take care of the
index 596f3cf..56455e6 100644 (file)
--- a/Makerules
+++ b/Makerules
@@ -351,7 +351,7 @@ endif
 \f
 # Modify the list of routines we build for different targets
 
-ifeq (yes,$(build-shared))
+ifeq (yesyes,$(build-shared)$(elf))
 ifndef libc.so-version
 # Undefine this because it can't work when we libc.so is unversioned.
 static-only-routines =
@@ -392,8 +392,13 @@ endif
 # $(LDLIBS-%.so) may contain -l switches to generate run-time dependencies
 # on other shared objects.
 lib%.so: lib%_pic.a $(+preinit) $(+postinit) $(+interp)
+ifneq (,$(findstring aix,$(config-os)))
+       (echo '#!'; \
+        dump -g $< | sed '1,6d' | cut -f2 | sort | uniq) > $(<:a=exp)
+endif
        $(build-shlib)
 
+ifeq ($(elf),yes)
 define build-shlib-helper
 $(LINK.o) -shared -Wl,-O1 $(sysdep-LDFLAGS) $(config-LDFLAGS) \
          $(extra-B-$(@F:lib%.so=%).so) -B$(csu-objpfx) \
@@ -402,6 +407,18 @@ $(LINK.o) -shared -Wl,-O1 $(sysdep-LDFLAGS) $(config-LDFLAGS) \
          $(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
          -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link)
 endef
+else
+ifneq (,$(findstring aix,$(config-os)))
+define build-shlib-helper
+$(LINK.o) -G -bM:SRE -bnoentry -bE:$(<:a=exp) \
+         $(sysdep-LDFLAGS) $(config-LDFLAGS) $(extra-B-$(@F:lib%.so=%).so) \
+         $(extra-B-$(@F:lib%.so=%).so) $(load-map-file) \
+         $(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
+         -L$(subst :, -L,$(rpath-link))
+endef
+else
+endif
+endif
 
 ifeq (yes,$(elf))
 # binutils only position loadable notes into the first page for binaries,
@@ -419,18 +436,36 @@ $(build-shlib-helper) -o $@ -T $@.lds \
 rm -f $@.lds
 endef
 else
+ifneq (,$(findstring aix,$(config-os)))
+define build-shlib
+$(build-shlib-helper) \
+       -o $@ \
+       $(filter-out $(map-file) $(+preinit) $(+postinit),$^) \
+       $(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
+endef
 define build-shlib
 $(build-shlib-helper) \
          $(build-shlib-objlist)
 endef
 endif
+endif
 
+ifneq (,$(findstring aix,$(config-os)))
+define build-module-helper
+$(LINK.o) -Wl,-G -Wl,-bM:SRE -Wl,-bnoentry -Wl,-bexpall \
+         $(sysdep-LDFLAGS) $(config-LDFLAGS) \
+         $(load-map-file) \
+         $(LDFLAGS.so) $(LDFLAGS-$(@F:%.so=%).so) \
+         -L$(subst :, -L,$(rpath-link)) -Wl,-L=$(rpath-link)
+endef
+else
 define build-module-helper
 $(LINK.o) -shared $(sysdep-LDFLAGS) $(config-LDFLAGS) \
          -B$(csu-objpfx) $(load-map-file) \
          $(LDFLAGS.so) $(LDFLAGS-$(@F:%.so=%).so) \
          -L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link)
 endef
+endif
 
 # This macro is similar to build-shlib but it does not define a soname
 # and it does not depend on the destination name to start with `lib'.
@@ -450,12 +485,22 @@ $(build-module-helper) -o $@ -T $@.lds \
 rm -f $@.lds
 endef
 else
+ifneq (,$(findstring aix,$(config-os)))
+define build-module
+$(build-module-helper) \
+         -o $@ \
+         $(filter-out $(map-file) $(+preinit) $(+postinit),$^) \
+         $(no-whole-archive) $(LDLIBS-$(@F:%.so=%).so)
+endef
+else
+define build-module
 define build-module
 $(build-module-helper) \
          -o $@ \
          $(build-module-objlist)
 endef
 endif
+endif
 
 build-module-helper-objlist = \
        $(patsubst %_pic.a,$(whole-archive) %_pic.a $(no-whole-archive),\
@@ -481,6 +526,7 @@ LDFLAGS-c.so += -u __register_frame
 # contains some of libc_pic.a already, which will prevent the COMMONs
 # from being allocated in libc.so, which introduces evil dependencies
 # between libc.so and ld.so, which can make it impossible to upgrade.
+ifeq ($(elf),yes)
 $(common-objpfx)libc_pic.os: $(common-objpfx)libc_pic.a
        $(LINK.o) -nostdlib -nostartfiles -r -o $@ \
        $(LDFLAGS-c_pic.os) -Wl,-d -Wl,--whole-archive $^
@@ -500,6 +546,23 @@ $(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
 common-generated += libc.so$(libc.so-version)
 endif
 endif
+else
+ifneq (,$(findstring aix,$(config-os)))
+$(common-objpfx)libc.so: $(common-objpfx)libc_pic.a
+       @rm -f $@
+       (echo '#!'; \
+        dump -g $^ | sed '1,6d' | cut -f2 | sort | uniq) > $(^:a=exp)
+       sed '/__mulh/d;/__mull/d;/__divss/d;/__divus/d;/__quoss/d;/__quous/d' \
+           /lib/syscalls.exp > $(common-objpfx)syscalls.exp
+       $(LINK.o) -G -bM:SRE -bnoentry -bE:$(^:a=exp) \
+                 -bE:$(common-objpfx)syscalls.exp \
+                 -bI:$(common-objpfx)syscalls.exp \
+                 -L$(common-objpfx) -o $@ $^
+# AIX runtime ld wants libc.so to be libc.a(shr.o) hardwired
+       cp $@ $(common-objpfx)shr.o
+       $(AR) $(ARFLAGS) $(common-objpfx)libc.a $(common-objpfx)shr.o
+endif
+endif
 \f
 # Figure out the source filenames in this directory.