Browse Source

Allow the shared lib loader to fallback on the builddir if everything
else fails. Let <arch>-uclibc-gcc --uclibc-use-build-dir set the
shared lib loader to the one in the builddir's path.
-Erik

Eric Andersen 23 years ago
parent
commit
4836768df7
6 changed files with 34 additions and 2 deletions
  1. 1 0
      Rules.mak
  2. 1 0
      extra/gcc-uClibc/Makefile
  3. 5 1
      extra/gcc-uClibc/gcc-uClibc.c
  4. 1 1
      ldso/ldso/Makefile
  5. 13 0
      ldso/ldso/dl-elf.c
  6. 13 0
      ldso/ldso/readelflib1.c

+ 1 - 0
Rules.mak

@@ -91,6 +91,7 @@ endif
 ifeq ($(LDSO_PRESENT), $(TARGET_ARCH))
 	LDSO=$(TOPDIR)lib/$(UCLIBC_LDSO)
 	DYNAMIC_LINKER=$(ROOT_DIR)/lib/$(UCLIBC_LDSO)
+	BUILD_DYNAMIC_LINKER=$(shell cd $(TOPDIR)lib; pwd)/$(UCLIBC_LDSO)
 else
 	LDSO=$(SYSTEM_LDSO)
 	DYNAMIC_LINKER=$(SYSTEM_LDSO)

+ 1 - 0
extra/gcc-uClibc/Makefile

@@ -19,6 +19,7 @@ gcc-uClibc.h: $(TOPDIR)/Config
 	@echo "#define GCC_INCDIR " \"-I$(GCCINCDIR)/\" >> gcc-uClibc.h
 	@echo "#define TARGET_ARCH " \"$(TARGET_ARCH)\" >> gcc-uClibc.h
 	@echo "#define DYNAMIC_LINKER " \"$(DYNAMIC_LINKER)\" >> gcc-uClibc.h
+	@echo "#define BUILD_DYNAMIC_LINKER " \"$(BUILD_DYNAMIC_LINKER)\" >> gcc-uClibc.h
 
 gcc-uClibc: gcc-uClibc.h gcc-uClibc.c
 	gcc -Wall -O2 -s gcc-uClibc.c -o $(TARGET_ARCH)-uclibc-gcc

+ 5 - 1
extra/gcc-uClibc/gcc-uClibc.c

@@ -118,8 +118,10 @@ int main(int argc, char **argv)
 	int i, j;
 	char ** gcc_argv;
 	char *dlstr;
+	char *build_dlstr;
 	char *ep;
 
+	build_dlstr = "-Wl,--dynamic-linker," BUILD_DYNAMIC_LINKER;
 	dlstr = getenv("UCLIBC_GCC_DLOPT");
 	if (!dlstr) {
 		dlstr = "-Wl,--dynamic-linker," DYNAMIC_LINKER;
@@ -216,7 +218,9 @@ int main(int argc, char **argv)
 	}
 	if (linking && source_count) {
 		if (!use_static_linking) {
-			if (dlstr) {
+			if (dlstr && use_build_dir) {
+				gcc_argv[i++] = build_dlstr;
+			} else if (dlstr) {
 				gcc_argv[i++] = dlstr;
 			}
 			if (use_rpath) {

+ 1 - 1
ldso/ldso/Makefile

@@ -29,7 +29,7 @@ TARGET_CFLAGS += #-DDL_DEBUG #-funroll-loops
 
 
 LDSO_FULLNAME=ld-uclibc-$(MAJOR_VERSION).$(MINOR_VERSION).so
-TARGET_CFLAGS+=-fPIC -D__PIC__ -DUCLIBC_ROOT_DIR=\"$(ROOT_DIR)\"
+TARGET_CFLAGS+=-fPIC -D__PIC__ -DUCLIBC_ROOT_DIR=\"$(ROOT_DIR)\" -DUCLIBC_BUILD_DIR=\"$(shell cd $(TOPDIR); pwd)\"
 CSRC= boot1.c hash.c readelflib1.c vsprintf.c $(TARGET_ARCH)/elfinterp.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 ASRC=$(shell ls $(TARGET_ARCH)/*.S)

+ 13 - 0
ldso/ldso/dl-elf.c

@@ -274,6 +274,19 @@ struct elf_resolve *_dl_load_shared_library(int secure,
 	if (tpnt1)
 	    return tpnt1;
 
+	/* Bummer.  Nothing so far.  Check in <builddir>/lib */
+	pnt1 = UCLIBC_BUILD_DIR "/lib/";
+	pnt = mylibname;
+	while (*pnt1)
+	    *pnt++ = *pnt1++;
+	pnt1 = libname;
+	while (*pnt1)
+	    *pnt++ = *pnt1++;
+	*pnt++ = 0;
+	tpnt1 = _dl_load_elf_shared_library(secure, mylibname, 0);
+	if (tpnt1)
+	    return tpnt1;
+
   goof:
 	/* Well, we shot our wad on that one.  All we can do now is punt */
 	if (_dl_internal_error_number)

+ 13 - 0
ldso/ldso/readelflib1.c

@@ -274,6 +274,19 @@ struct elf_resolve *_dl_load_shared_library(int secure,
 	if (tpnt1)
 	    return tpnt1;
 
+	/* Bummer.  Nothing so far.  Check in <builddir>/lib */
+	pnt1 = UCLIBC_BUILD_DIR "/lib/";
+	pnt = mylibname;
+	while (*pnt1)
+	    *pnt++ = *pnt1++;
+	pnt1 = libname;
+	while (*pnt1)
+	    *pnt++ = *pnt1++;
+	*pnt++ = 0;
+	tpnt1 = _dl_load_elf_shared_library(secure, mylibname, 0);
+	if (tpnt1)
+	    return tpnt1;
+
   goof:
 	/* Well, we shot our wad on that one.  All we can do now is punt */
 	if (_dl_internal_error_number)