ld patch

Andreas Hauser andy at splashground.de
Wed Mar 24 20:00:23 PST 2004


Hoi,

attached patch let's the new binutils work like the old.

Before:

$ gcc -lGLU -L/usr/X11R6/lib
/usr/libexec/binutils214/elf/ld: warning: libstdc++.so.4, needed by /usr/X11R6/lib/libGLU.so, not
found (try using -rpath or -rpath-link)
/usr/lib/crt1.o(.text+0x88): In function `_start':
: undefined reference to `main'
/usr/X11R6/lib/libGLU.so: undefined reference to `operator new[](unsigned)'
/usr/X11R6/lib/libGLU.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/usr/X11R6/lib/libGLU.so: undefined reference to `operator delete(void*)'
/usr/X11R6/lib/libGLU.so: undefined reference to `__gxx_personality_v0'
/usr/X11R6/lib/libGLU.so: undefined reference to `__cxa_pure_virtual'
/usr/X11R6/lib/libGLU.so: undefined reference to `vtable for __cxxabiv1::__class_type_info'
/usr/X11R6/lib/libGLU.so: undefined reference to `operator delete[](void*)'
/usr/X11R6/lib/libGLU.so: undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info'
/usr/X11R6/lib/libGLU.so: undefined reference to `operator new(unsigned)'

After:

$ gcc -lGLU -L/usr/X11R6/lib
 /usr/lib/crt1.o(.text+0x88): In function `_start':
 : undefined reference to `main'


Andy

also here:
http://ftp.fortunaty.net/DragonFly/inofficial/patches/binutils214::ld.patch.bz2

Index: gnu/usr.bin/binutils214/ld/Makefile.i386
===================================================================
RCS file: /home/dcvs/src/gnu/usr.bin/binutils214/ld/Makefile.i386,v
retrieving revision 1.1
diff -u -p -r1.1 Makefile.i386
--- gnu/usr.bin/binutils214/ld/Makefile.i386	1 Feb 2004 08:53:04 -0000	1.1
+++ gnu/usr.bin/binutils214/ld/Makefile.i386	26 Mar 2004 04:32:14 -0000
@@ -16,13 +16,16 @@ EMS+=		${NATIVE_EMULATION}
 LDSCRIPTS+=	${NATIVE_EMULATION}.x ${NATIVE_EMULATION}.xbn ${NATIVE_EMULATION}.xn ${NATIVE_EMULATION}.xr \
 		${NATIVE_EMULATION}.xs ${NATIVE_EMULATION}.xu ${NATIVE_EMULATION}.xc ${NATIVE_EMULATION}.xsc
 SRCS+=	e${NATIVE_EMULATION}.c
-CLEANFILES+=	e${NATIVE_EMULATION}.c
+CLEANFILES+=	e${NATIVE_EMULATION}.c elf32.em
 
 e${NATIVE_EMULATION}.c: emulparams/${NATIVE_EMULATION}.sh emultempl/elf32.em \
-    scripttempl/elf.sc genscripts.sh stringify.sed
-	sh ${SRCDIR}/ld/genscripts.sh ${SRCDIR}/ld ${_i386_path} \
-	    "" ${HOST} ${TARGET_TUPLE} ${TARGET_TUPLE} \
-	    "${NATIVE_EMULATION}" "" no ${NATIVE_EMULATION} "${TARGET_TUPLE}"
+    scripttempl/elf.sc genscripts.sh stringify.sed ${.CURDIR}/patches/elf32.em.patch
+	patch -o elf32.em -i ${.CURDIR}/patches/elf32.em.patch ${SRCDIR}/ld/emultempl/elf32.em
+	# make the script use the patched version
+	sed 's!$${srcdir}/emultempl/$${TEMPLATE_NAME-generic}.em!$${TEMPLATE_NAME-generic}.em!' \
+	    ${SRCDIR}/ld/genscripts.sh \
+		| sh -s ${SRCDIR}/ld ${_i386_path}  "" ${HOST} ${TARGET_TUPLE} ${TARGET_TUPLE} \
+	        "${NATIVE_EMULATION}" "" no ${NATIVE_EMULATION} "${TARGET_TUPLE}"
 #	sh ${.CURDIR}/genscripts.sh ${SRCDIR}/ld ${_i386_path} \
 #	    ${HOST} ${TARGET_TUPLE} ${TARGET_TUPLE} \
 #	    "${NATIVE_EMULATION}" "" ${NATIVE_EMULATION} "${TARGET_TUPLE}"
Index: gnu/usr.bin/binutils214/ld/patches/elf32.em.patch
===================================================================
RCS file: gnu/usr.bin/binutils214/ld/patches/elf32.em.patch
diff -N gnu/usr.bin/binutils214/ld/patches/elf32.em.patch
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/binutils214/ld/patches/elf32.em.patch	26 Mar 2004 01:53:08 -0000
@@ -0,0 +1,188 @@
+--- emultempl/elf32.em	2 Feb 2004 07:29:28 -0000	1.1
++++ emultempl/elf32.em	25 Mar 2004 23:56:10 -0000
+@@ -440,11 +440,68 @@ gld${EMULATION_NAME}_search_needed (path
+ }
+ 
+ EOF
+-if [ "x${USE_LIBPATH}" = xyes ] ; then
+-  cat >>e${EMULATION_NAME}.c <<EOF
++if [ "x${host}" = "x${target}" ] ; then
++  case " ${EMULATION_LIBPATH} " in
++  *" ${EMULATION_NAME} "*)
++    case ${target} in
++      *-*-freebsd* | *-*-dragonfly*)
++	cat >>e${EMULATION_NAME}.c <<EOF
++/*
++ * Read the system search path the FreeBSD way rather than like Linux.
++ */
++#include <elf-hints.h>
+ 
+-/* Add the sysroot to every entry in a colon-separated path.  */
++static bfd_boolean gld${EMULATION_NAME}_check_ld_elf_hints
++  PARAMS ((const char *, int));
++
++static bfd_boolean
++gld${EMULATION_NAME}_check_ld_elf_hints (name, force)
++     const char *name;
++     int force;
++{
++  static bfd_boolean initialized;
++  static char *ld_elf_hints;
++
++  if (! initialized)
++    {
++      FILE *f;
++
++      f = fopen (_PATH_ELF_HINTS, FOPEN_RB);
++      if (f != NULL)
++	{
++	  struct elfhints_hdr hdr;
++
++	  if (fread(&hdr, 1, sizeof(hdr), f) == sizeof(hdr) &&
++	      hdr.magic == ELFHINTS_MAGIC &&
++	      hdr.version == 1)
++	    {
++	      if (fseek(f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
++		{
++		  char *b;
+ 
++		  b = (char *) xmalloc (hdr.dirlistlen + 1);
++		  if (fread(b, 1, hdr.dirlistlen + 1, f) !=
++		      hdr.dirlistlen + 1)
++		    {
++		      free(b);
++		    }
++		  else
++		    {
++		      ld_elf_hints = b;
++		    }
++		}
++	    }
++	  fclose (f);
++	}
++
++      initialized = TRUE;
++    }
++
++  if (ld_elf_hints == NULL)
++    return FALSE;
++
++  return gld${EMULATION_NAME}_search_needed (ld_elf_hints, name, force);
++}
+ static char * gld${EMULATION_NAME}_add_sysroot PARAMS ((const char *));
+ 
+ static char *
+@@ -484,9 +541,12 @@ gld${EMULATION_NAME}_add_sysroot (path)
+ }
+ 
+ EOF
+-  case ${target} in
+-    *-*-linux-gnu*)
+-      cat >>e${EMULATION_NAME}.c <<EOF
++	# DragonFly
++	;;
++
++      *-*-linux-gnu*)
++	cat >>e${EMULATION_NAME}.c <<EOF
++
+ /* For a native linker, check the file /etc/ld.so.conf for directories
+    in which we may find shared libraries.  /etc/ld.so.conf is really
+    only meaningful on Linux.  */
+@@ -581,6 +641,7 @@ gld${EMULATION_NAME}_check_ld_so_conf (n
+ EOF
+     # Linux
+     ;;
++    esac
+   esac
+ fi
+ cat >>e${EMULATION_NAME}.c <<EOF
+@@ -694,12 +755,16 @@ gld${EMULATION_NAME}_after_open ()
+ 	  size_t len;
+ 	  search_dirs_type *search;
+ EOF
+-if [ "x${USE_LIBPATH}" = xyes ] ; then
++if [ "x${host}" = "x${target}" ] ; then
++  case " ${EMULATION_LIBPATH} " in
++  *" ${EMULATION_NAME} "*)
+ cat >>e${EMULATION_NAME}.c <<EOF
+ 	  const char *lib_path;
+ 	  struct bfd_link_needed_list *rp;
+ 	  int found;
+ EOF
++  ;;
++  esac
+ fi
+ cat >>e${EMULATION_NAME}.c <<EOF
+ 
+@@ -707,15 +772,13 @@ cat >>e${EMULATION_NAME}.c <<EOF
+ 						  l->name, force))
+ 	    break;
+ EOF
+-if [ "x${USE_LIBPATH}" = xyes ] ; then
++if [ "x${host}" = "x${target}" ] ; then
++  case " ${EMULATION_LIBPATH} " in
++  *" ${EMULATION_NAME} "*)
+ cat >>e${EMULATION_NAME}.c <<EOF
+ 	  if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
+ 						  l->name, force))
+ 	    break;
+-EOF
+-fi
+-if [ "x${NATIVE}" = xyes ] ; then
+-cat >>e${EMULATION_NAME}.c <<EOF
+ 	  if (command_line.rpath_link == NULL
+ 	      && command_line.rpath == NULL)
+ 	    {
+@@ -727,10 +790,7 @@ cat >>e${EMULATION_NAME}.c <<EOF
+ 	  lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
+ 	  if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
+ 	    break;
+-EOF
+-fi
+-if [ "x${USE_LIBPATH}" = xyes ] ; then
+-cat >>e${EMULATION_NAME}.c <<EOF
++
+ 	  found = 0;
+ 	  rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
+ 	  for (; !found && rp != NULL; rp = rp->next)
+@@ -746,6 +806,8 @@ cat >>e${EMULATION_NAME}.c <<EOF
+ 	    break;
+ 
+ EOF
++  ;;
++  esac
+ fi
+ cat >>e${EMULATION_NAME}.c <<EOF
+ 	  len = strlen (l->name);
+@@ -764,15 +826,25 @@ cat >>e${EMULATION_NAME}.c <<EOF
+ 	  if (search != NULL)
+ 	    break;
+ EOF
+-if [ "x${USE_LIBPATH}" = xyes ] ; then
+-  case ${target} in
+-    *-*-linux-gnu*)
+-      cat >>e${EMULATION_NAME}.c <<EOF
++if [ "x${host}" = "x${target}" ] ; then
++  case " ${EMULATION_LIBPATH} " in
++  *" ${EMULATION_NAME} "*)
++    case ${target} in
++      *-*-freebsd* | *-*-dragonfly*)
++	cat >>e${EMULATION_NAME}.c <<EOF
++	  if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
++	    break;
++EOF
++        ;;
++      *-*-linux-gnu*)
++	cat >>e${EMULATION_NAME}.c <<EOF
+ 	  if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
+ 	    break;
+ EOF
+-    # Linux
+-    ;;
++	# Linux
++        ;;
++    esac
++  ;;
+   esac
+ fi
+ cat >>e${EMULATION_NAME}.c <<EOF





More information about the Submit mailing list