Index: binutils-2.16.1/ld/Makefile.in =================================================================== --- binutils-2.16.1.orig/ld/Makefile.in +++ binutils-2.16.1/ld/Makefile.in @@ -347,6 +347,7 @@ ALL_EMULATIONS = \ ei386beos.o \ ei386bsd.o \ ei386coff.o \ + ei386freebsd.o \ ei386go32.o \ ei386linux.o \ ei386lynx.o \ @@ -1711,6 +1712,9 @@ ei386bsd.c: $(srcdir)/emulparams/i386bsd ei386coff.c: $(srcdir)/emulparams/i386coff.sh \ $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/i386coff.sc ${GEN_DEPENDS} ${GENSCRIPTS} i386coff "$(tdir_i386coff)" +ei386freebsd.c: $(srcdir)/emulparams/i386freebsd.sh \ + $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS} + ${GENSCRIPTS} i386freebsd "$(tdir_i386freebsd)" ei386go32.c: $(srcdir)/emulparams/i386go32.sh \ $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/i386go32.sc ${GEN_DEPENDS} ${GENSCRIPTS} i386go32 "$(tdir_i386go32)" Index: binutils-2.16.1/ld/emulparams/i386freebsd.sh =================================================================== --- /dev/null +++ binutils-2.16.1/ld/emulparams/i386freebsd.sh @@ -0,0 +1,6 @@ +SCRIPT_NAME=aout +TEXT_START_ADDR=0x1020 +OUTPUT_FORMAT="a.out-i386-freebsd" +TARGET_PAGE_SIZE=0x1000 +ARCH=i386 +EXECUTABLE_SYMBOLS='__DYNAMIC = 0;' Index: binutils-2.16.1/ld/emultempl/elf32.em =================================================================== --- binutils-2.16.1.orig/ld/emultempl/elf32.em +++ binutils-2.16.1/ld/emultempl/elf32.em @@ -522,6 +522,69 @@ gld${EMULATION_NAME}_add_sysroot (const EOF case ${target} in + *-*-freebsd*) + cat >>e${EMULATION_NAME}.c < + +static bfd_boolean +gld${EMULATION_NAME}_check_ld_elf_hints (struct dt_needed *n, int force) +{ + const char *name = n->name; + static bfd_boolean initialized; + static char *ld_elf_hints; + + if (! initialized) + { + FILE *f; + char *tmppath; + + tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, NULL); + f = fopen (tmppath, FOPEN_RB); + free (tmppath); + 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); + b = NULL; + } + else + { + ld_elf_hints = gld${EMULATION_NAME}_add_sysroot (b); + free (b); + } + } + } + fclose (f); + } + + initialized = TRUE; + } + + if (ld_elf_hints == NULL) + return FALSE; + + return gld${EMULATION_NAME}_search_needed (ld_elf_hints, n, force); +} +EOF + # FreeBSD + ;; + *-*-linux-gnu*) cat >>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <name, force))