diff --git a/contrib/binutils/ld/emultempl/elf32.em b/contrib/binutils/ld/emultempl/elf32.em index c4debe2a92a..ece1d2e0fae 100644 --- a/contrib/binutils/ld/emultempl/elf32.em +++ b/contrib/binutils/ld/emultempl/elf32.em @@ -139,8 +139,69 @@ gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry) EOF if [ "x${host}" = "x${target}" ] ; then if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then -cat >>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c < +static boolean gld${EMULATION_NAME}_check_ld_elf_hints + PARAMS ((const char *, int)); + +static boolean +gld${EMULATION_NAME}_check_ld_elf_hints (name, force) + const char *name; + int force; +{ + static 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); +} +EOF + ;; + *) + cat >>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <name, force)) + break; +EOF + ;; + *) + cat >>e${EMULATION_NAME}.c <name, force)) break; EOF + ;; + esac fi fi cat >>e${EMULATION_NAME}.c <