Browse Source

Make shared libs properly list the correct ld.so in the interp
field by being sneaky.

Eric Andersen 22 years ago
parent
commit
c35cde1edb
7 changed files with 25 additions and 10 deletions
  1. 2 1
      ldso/libdl/Makefile
  2. 2 1
      libc/Makefile
  3. 12 3
      libc/misc/internals/Makefile
  4. 2 1
      libcrypt/Makefile
  5. 3 2
      libm/Makefile
  6. 2 1
      libresolv/Makefile
  7. 2 1
      libutil/Makefile

+ 2 - 1
ldso/libdl/Makefile

@@ -52,7 +52,8 @@ $(OBJ): Makefile
 shared:
 	$(LD) $(LDFLAGS) -soname=$(LIBDL_SHARED).$(MAJOR_VERSION) \
 		-o $(LIBDL_SHARED_FULLNAME) --whole-archive $(LIBDL) \
-		--no-whole-archive -L$(TOPDIR)/lib -lc;
+		--no-whole-archive $(TOPDIR)/libc/misc/internals/interp.o \
+		-L$(TOPDIR)/lib -lc;
 	install -d $(TOPDIR)lib
 	rm -f $(TOPDIR)lib/$(LIBDL_SHARED_FULLNAME) $(TOPDIR)lib/$(LIBDL_SHARED).$(MAJOR_VERSION)
 	install -m 644 $(LIBDL_SHARED_FULLNAME) $(TOPDIR)lib;

+ 2 - 1
libc/Makefile

@@ -47,7 +47,8 @@ shared: $(TOPDIR)lib/$(LIBNAME)
 	@(cd tmp && CC=$(CC) LD=$(LD) NM=$(NM) AR=$(AR) \
 		/bin/sh ../../extra/scripts/get-needed-libgcc-objects.sh)
 	$(LD) $(LDFLAGS) -soname=$(SHARED_MAJORNAME) -o $(SHARED_FULLNAME) \
-		--whole-archive ./tmp/libgcc-need.a $(LIBNAME) --no-whole-archive $(LDSO)
+		--whole-archive ./tmp/libgcc-need.a $(LIBNAME) --no-whole-archive \
+		$(TOPDIR)/libc/misc/internals/interp.o
 	@/bin/true #rm -rf tmp
 	install -d $(TOPDIR)lib
 	rm -f $(TOPDIR)lib/$(SHARED_FULLNAME)

+ 12 - 3
libc/misc/internals/Makefile

@@ -35,17 +35,26 @@ endif
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 OBJS=$(COBJS)
 
-all: $(OBJS) $(LIBC)
+all: $(OBJS) interp.o $(LIBC)
 
-$(LIBC): ar-target
+$(LIBC): interp.c ar-target
 
 ar-target: $(OBJS)
 	$(AR) $(ARFLAGS) $(LIBC) $(OBJS)
 
+interp.c: Makefile
+	echo "/* Force shared libraries to know about the correct library loader */" > interp.c
+	echo "const char __dl_ldso__[] __attribute__ ((section " \
+		"(\".interp\"))) =\""$(DYNAMIC_LINKER)"\";" >> interp.c
+
 $(COBJS): %.o : %.c
 	$(CC) $(CFLAGS) -c $< -o $@
 	$(STRIPTOOL) -x -R .note -R .comment $*.o
 
+interp.o: %.o : %.c
+	$(CC) $(CFLAGS) -c $< -o $@
+	$(STRIPTOOL) -x -R .note -R .comment $*.o
+
 clean:
-	rm -f *.[oa] *~ core
+	rm -f *.[oa] interp.c *~ core
 

+ 2 - 1
libcrypt/Makefile

@@ -50,7 +50,8 @@ $(OBJ): Makefile
 shared: all
 	$(LD) $(LDFLAGS) -soname=$(LIBCRYPT_SHARED).$(MAJOR_VERSION) \
 		-o $(LIBCRYPT_SHARED_FULLNAME) --whole-archive $(LIBCRYPT) \
-		--no-whole-archive -L$(TOPDIR)/lib -lc;
+		--no-whole-archive $(TOPDIR)/libc/misc/internals/interp.o \
+		-L$(TOPDIR)/lib -lc;
 	install -d $(TOPDIR)lib
 	rm -f $(TOPDIR)lib/$(LIBCRYPT_SHARED_FULLNAME) $(TOPDIR)lib/$(LIBCRYPT_SHARED).$(MAJOR_VERSION)
 	install -m 644 $(LIBCRYPT_SHARED_FULLNAME) $(TOPDIR)lib;

+ 3 - 2
libm/Makefile

@@ -94,8 +94,9 @@ shared: all
 	@if [ -f $(LIBM) ] ; then \
 	    set -x -e; \
 	    $(LD) $(LDFLAGS) -soname=$(LIBM_SHARED).$(MAJOR_VERSION) \
-		    -o $(LIBM_SHARED_FULLNAME) --whole-archive $(LIBM) \
-		    --no-whole-archive -L$(TOPDIR)/lib -lc; \
+		-o $(LIBM_SHARED_FULLNAME) --whole-archive $(LIBM) \
+		--no-whole-archive $(TOPDIR)/libc/misc/internals/interp.o \
+		-L$(TOPDIR)/lib -lc; \
 	    install -d $(TOPDIR)lib; \
 	    rm -f $(TOPDIR)lib/$(LIBM_SHARED_FULLNAME) $(TOPDIR)lib/$(LIBM_SHARED).$(MAJOR_VERSION); \
 	    install -m 644 $(LIBM_SHARED_FULLNAME) $(TOPDIR)lib; \

+ 2 - 1
libresolv/Makefile

@@ -51,7 +51,8 @@ $(OBJ): Makefile
 shared: all
 	$(LD) $(LDFLAGS) -soname=$(LIBRESOLV_SHARED).$(MAJOR_VERSION) \
 		-o $(LIBRESOLV_SHARED_FULLNAME) --whole-archive $(LIBRESOLV) \
-		--no-whole-archive -L$(TOPDIR)/lib -lc;
+		--no-whole-archive $(TOPDIR)/libc/misc/internals/interp.o \
+		-L$(TOPDIR)/lib -lc;
 	install -d $(TOPDIR)lib
 	rm -f $(TOPDIR)lib/$(LIBRESOLV_SHARED_FULLNAME) $(TOPDIR)lib/$(LIBRESOLV_SHARED).$(MAJOR_VERSION)
 	install -m 644 $(LIBRESOLV_SHARED_FULLNAME) $(TOPDIR)lib;

+ 2 - 1
libutil/Makefile

@@ -52,7 +52,8 @@ $(OBJS): %.o : %.c
 shared: all
 	$(LD) $(LDFLAGS) -soname=$(LIBUTIL_SHARED).$(MAJOR_VERSION) \
 		-o $(LIBUTIL_SHARED_FULLNAME) --whole-archive $(LIBUTIL) \
-		--no-whole-archive -L$(TOPDIR)/lib -lc;
+		--no-whole-archive $(TOPDIR)/libc/misc/internals/interp.o \
+		-L$(TOPDIR)/lib -lc;
 	install -d $(TOPDIR)lib
 	rm -f $(TOPDIR)lib/$(LIBUTIL_SHARED_FULLNAME) $(TOPDIR)lib/$(LIBUTIL_SHARED).$(MAJOR_VERSION)
 	install -m 644 $(LIBUTIL_SHARED_FULLNAME) $(TOPDIR)lib/;