This is the binary release of binutils 2.5.2.6. It fixes a few bugs: 1. When using gcc -g without -static in the final linking in the a.out format, the linker will inform you which shared library is missing and no executables will be outputted. You should use -g and -static or remove -g if that happens. 2. Sometimes ld will put an extra page between text and data if text ends on the page boundary. It is fixed. 3. as may mis-assemble the PIC code. 4. From Eric: I was trying to link a shared library, and I was explicitly linking against a different shared library. I had a symbol test2 (function, actually), which was referenced in lib2.o and defined in lib1.so. When we entered the function elf_i386_relocate_section, we would discover the relocation, and see that it was a defined symbol. We attempt to look up the relocation value for this relocation, and we segfault because the input section came from the shared library, and thus the input section had no output section defined. The point was that this value for relocation that we were trying to calculate was irrelevant - since this was a PLT32 relocation, a PLT slot exists for this symbol, and we calculate a new value for the relocation based upon the plt_offset field. Thus the enclosed fix works because we know that we will choose a new value for relocation later on. 5. Put the .ctors/.dtors in the data segment since they are writable. 6. Fix the problem whereby applications can be linked and have unresolved externals - if there were unresolved externals in shared libraries that we were not resolving, then there are no assocuated relocations, and the user gets no messages. The patch watches for this specific case and reports an undefined symbol message if this happens. 7. Take out Lynx support in the ELF linker 8. Fix a bug in the ELF linker. 9. Add the man pages. The primary ftp sites for the compiler/C library are tsx-11.mit.edu under pub/linux/packages/GCC and sunsite.unc.edu under pub/Linux/GCC. You need libc 4.6.27 or above to run this package. ld.so 1.5.2 or above is REQUIRED. To install this package, please follow the procedure very closely. Please backup/save all the files you are instructed to delete and you should do tar tvvfz binutils-2.5.2.6.bin.tar.gz tar tvvfz binutils-2.5.2.6.man.tar.gz to see what is in there. The pacth from 2.5.2 to 2.5.2.6, is enclosed here. To install, PLEASE DO 1. su root 2. cd /usr/bin 3. rm -f as ar gprof ranlib size objdump objcopy nm strip strings gasp c++filt 4. cd / 5. tar xfz binutils-2.5.2.6.bin.tar.gz 6. tar xfz binutils-2.5.2.6.man.tar.gz Now you have the new gas/binutils under /usr/bin. Thanks. H.J. Lu hjl@nynexst.com 12/16/94 ---- This patch contains some necessary bug fixes for binutils 2.5.2 to support ELF. It is called 2.5.2.6 by me. The fixes may not be the same as the ones in the next public release of binutils. H.J. 12/14/94 --- *** ./binutils/Makefile.in.orig Tue Nov 29 11:03:51 1994 --- ./binutils/Makefile.in Wed Dec 14 11:42:03 1994 *************** *** 70,76 **** LEX = `if [ -f ../flex/flex ] ; then echo ../flex/flex ; else echo flex ; fi` # Distribution version ! VERSION=2.5.2 # Distribution name DIST_NAME=binutils-${VERSION} --- 70,76 ---- LEX = `if [ -f ../flex/flex ] ; then echo ../flex/flex ; else echo flex ; fi` # Distribution version ! VERSION=2.5.2.6 # Distribution name DIST_NAME=binutils-${VERSION} *** ./config/mh-linux.orig Mon Nov 28 19:55:59 1994 --- ./config/mh-linux Mon Nov 28 19:56:07 1994 *************** *** 2,8 **** # FIXME: What is this used for? It should go away (and even if it hasn't, # it's not clear linux should define it). SYSV = -DSYSV ! RANLIB = ranlib # What is this doing here? #LDFLAGS = -static --- 2,8 ---- # FIXME: What is this used for? It should go away (and even if it hasn't, # it's not clear linux should define it). SYSV = -DSYSV ! #RANLIB = ranlib # What is this doing here? #LDFLAGS = -static *** ./bfd/config/i386linux.mh.orig Mon Nov 28 19:55:18 1994 --- ./bfd/config/i386linux.mh Mon Nov 28 19:55:27 1994 *************** *** 1,4 **** HDEFINES=-DTRAD_CORE HDEPFILES=trad-core.o # Apparently this is needed to build objdump in certain configurations. ! EXTRALIBS=-lm --- 1,4 ---- HDEFINES=-DTRAD_CORE HDEPFILES=trad-core.o # Apparently this is needed to build objdump in certain configurations. ! #EXTRALIBS=-lm *** ./bfd/bfd-in.h.orig Mon Sep 26 11:01:57 1994 --- ./bfd/bfd-in.h Fri Nov 11 14:30:17 1994 *************** *** 545,555 **** extern boolean bfd_elf64_record_link_assignment PARAMS ((bfd *, struct bfd_link_info *, const char *)); extern boolean bfd_elf32_size_dynamic_sections ! PARAMS ((bfd *, const char *, const char *, struct bfd_link_info *, ! struct sec **)); extern boolean bfd_elf64_size_dynamic_sections ! PARAMS ((bfd *, const char *, const char *, struct bfd_link_info *, ! struct sec **)); extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *)); /* SunOS shared library support routines for the linker. */ --- 545,555 ---- extern boolean bfd_elf64_record_link_assignment PARAMS ((bfd *, struct bfd_link_info *, const char *)); extern boolean bfd_elf32_size_dynamic_sections ! PARAMS ((bfd *, const char *, const char *, boolean, ! struct bfd_link_info *, struct sec **)); extern boolean bfd_elf64_size_dynamic_sections ! PARAMS ((bfd *, const char *, const char *, boolean, ! struct bfd_link_info *, struct sec **)); extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *)); /* SunOS shared library support routines for the linker. */ *** ./bfd/bfd-in2.h.orig Fri Oct 21 21:27:50 1994 --- ./bfd/bfd-in2.h Fri Nov 11 14:30:17 1994 *************** *** 545,555 **** extern boolean bfd_elf64_record_link_assignment PARAMS ((bfd *, struct bfd_link_info *, const char *)); extern boolean bfd_elf32_size_dynamic_sections ! PARAMS ((bfd *, const char *, const char *, struct bfd_link_info *, ! struct sec **)); extern boolean bfd_elf64_size_dynamic_sections ! PARAMS ((bfd *, const char *, const char *, struct bfd_link_info *, ! struct sec **)); extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *)); /* SunOS shared library support routines for the linker. */ --- 545,555 ---- extern boolean bfd_elf64_record_link_assignment PARAMS ((bfd *, struct bfd_link_info *, const char *)); extern boolean bfd_elf32_size_dynamic_sections ! PARAMS ((bfd *, const char *, const char *, boolean, ! struct bfd_link_info *, struct sec **)); extern boolean bfd_elf64_size_dynamic_sections ! PARAMS ((bfd *, const char *, const char *, boolean, ! struct bfd_link_info *, struct sec **)); extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *)); /* SunOS shared library support routines for the linker. */ *** ./bfd/elfcode.h.orig Tue Nov 1 17:59:53 1994 --- ./bfd/elfcode.h Sat Dec 10 14:09:19 1994 *************** *** 1845,1851 **** --- 1845,1858 ---- if (phdr->p_type != PT_NULL && (hdr->sh_offset - (phdr->p_offset + phdr->p_memsz) == hdr->sh_addr - (phdr->p_vaddr + phdr->p_memsz)) + #if 0 + /* FIXME: ctors/dtors contain the code, but are r/w. */ + && (last_type != SHT_NOBITS || hdr->sh_type == SHT_NOBITS) + && (((hdr->sh_flags & SHF_WRITE) == 0 && (phdr->p_flags & PF_W) == 0) + || ((hdr->sh_flags & SHF_WRITE) != 0 && (phdr->p_flags & PF_W) != 0))) + #else && (last_type != SHT_NOBITS || hdr->sh_type == SHT_NOBITS)) + #endif { bfd_size_type adjust; *************** *** 3744,3749 **** --- 3751,3758 ---- PARAMS ((bfd *, struct bfd_link_info *)); static Elf_Internal_Rela *elf_link_read_relocs PARAMS ((bfd *, asection *, PTR, Elf_Internal_Rela *, boolean)); + static boolean elf_export_symbol + PARAMS ((struct elf_link_hash_entry *, PTR)); static boolean elf_adjust_dynamic_symbol PARAMS ((struct elf_link_hash_entry *, PTR)); *************** *** 4863,4873 **** addresses of the various sections. */ boolean ! NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath, info, ! sinterpptr) bfd *output_bfd; const char *soname; const char *rpath; struct bfd_link_info *info; asection **sinterpptr; { --- 4872,4883 ---- addresses of the various sections. */ boolean ! NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath, ! export_dynamic, info, sinterpptr) bfd *output_bfd; const char *soname; const char *rpath; + boolean export_dynamic; struct bfd_link_info *info; asection **sinterpptr; { *************** *** 4887,4892 **** --- 4897,4908 ---- if (dynobj == NULL) return true; + /* If we are supposed to export all symbols into the dynamic symbol + table (this is not the normal case), then do so. */ + if (export_dynamic) + elf_link_hash_traverse (elf_hash_table (info), elf_export_symbol, + (PTR) info); + if (elf_hash_table (info)->dynamic_sections_created) { *sinterpptr = bfd_get_section_by_name (dynobj, ".interp"); *************** *** 5019,5024 **** --- 5035,5064 ---- return true; } + /* This routine is used to export all defined symbols into the dynamic + symbol table. It is called via elf_link_hash_traverse. */ + + static boolean + elf_export_symbol (h, data) + struct elf_link_hash_entry *h; + PTR data; + { + struct bfd_link_info *info = (struct bfd_link_info *) data; + + if (h->dynindx == -1 + && (h->elf_link_hash_flags & (ELF_LINK_HASH_DEF_REGULAR + | ELF_LINK_HASH_REF_REGULAR)) != 0) + { + if (! elf_link_record_dynamic_symbol (info, h)) + { + /* FIXME: No way to report error. */ + abort (); + } + } + + return true; + } + /* Make the backend pick a good value for a dynamic symbol. This is called via elf_link_hash_traverse, and also calls itself recursively. */ *************** *** 5202,5207 **** --- 5242,5248 ---- dynamic = elf_hash_table (info)->dynamic_sections_created; dynobj = elf_hash_table (info)->dynobj; + BFD_ASSERT (dynamic ? dynobj != 0 : dynobj == 0); /* FIXME */ finfo.info = info; finfo.output_bfd = abfd; *************** *** 5895,5900 **** --- 5936,5955 ---- strip = true; else strip = false; + + /* + * If we are not creating a shared library, complain about any symbols which + * are undefined. If we do not do this, the linker will not complain about + * unresolved references within shared libraries, and the application might + * die at runtime. Only warn about symbols that are referenced in shared libraries + * and not in regular .o files - the rest have been warned about already. + */ + if (!finfo->info->shared && + !(h->elf_link_hash_flags & (ELF_LINK_HASH_DEF_REGULAR | ELF_LINK_HASH_DEF_DYNAMIC)) + && (h->elf_link_hash_flags & (ELF_LINK_HASH_REF_REGULAR | ELF_LINK_HASH_REF_DYNAMIC)) + == ELF_LINK_HASH_REF_DYNAMIC) + (*finfo->info->callbacks->undefined_symbol) + (finfo, h->root.root.string, h->root.u.undef.abfd, bfd_und_section_ptr, 0); /* If we're stripping it, and it's not a dynamic symbol, there's nothing else to do. */ *** ./bfd/elf32-i386.c.orig Fri Nov 4 10:35:44 1994 --- ./bfd/elf32-i386.c Wed Dec 14 09:26:08 1994 *************** *** 1035,1043 **** if (h->root.type == bfd_link_hash_defined) { sec = h->root.u.def.section; ! relocation = (h->root.u.def.value ! + sec->output_section->vma ! + sec->output_offset); } else if (h->root.type == bfd_link_hash_weak) relocation = 0; --- 1035,1059 ---- if (h->root.type == bfd_link_hash_defined) { sec = h->root.u.def.section; ! if (r_type == R_386_GOTPC ! || (r_type == R_386_PLT32 ! && h->plt_offset != (bfd_vma) -1) ! || (r_type == R_386_GOT32 ! && elf_hash_table (info)->dynamic_sections_created) ! || (info->shared ! && (r_type == R_386_32 ! || r_type == R_386_PC32) ! && (input_section->flags & SEC_ALLOC) != 0)) ! { ! /* In these cases, we don't need the relocation ! value. We check specially because in some ! obscure cases sec->output_section will be NULL. */ ! relocation = 0; ! } ! else ! relocation = (h->root.u.def.value ! + sec->output_section->vma ! + sec->output_offset); } else if (h->root.type == bfd_link_hash_weak) relocation = 0; *** ./bfd/i386linux.c.orig Mon Aug 22 11:00:32 1994 --- ./bfd/i386linux.c Tue Nov 29 02:12:59 1994 *************** *** 91,96 **** --- 91,102 ---- #define PLT_REF_PREFIX "__PLT_" #endif + /* Used to generate specialized error messages */ + + #ifndef NEEDS_SHRLIB + #define NEEDS_SHRLIB "__NEEDS_SHRLIB_" + #endif + #define IS_PLT_SYM(name) \ (strncmp (name, PLT_REF_PREFIX, sizeof PLT_REF_PREFIX - 1) == 0) *************** *** 416,423 **** --- 422,453 ---- struct bfd_link_info *info = (struct bfd_link_info *) data; struct fixup *f, *f1; int is_plt; + char * missing_filename, *cpnt; struct linux_link_hash_entry *h1, *h2; boolean exists; + + if (h->root.root.type == bfd_link_hash_undefined && + strncmp(h->root.root.root.string, NEEDS_SHRLIB, strlen(NEEDS_SHRLIB)) == 0) + { + missing_filename = strdup(h->root.root.root.string + strlen(NEEDS_SHRLIB)); + cpnt = strrchr(missing_filename, '_'); + if (cpnt) + { + *cpnt = 0; + fprintf (stderr, + "ld: Output file requires shared library `%s.so.%s'\n", + missing_filename, cpnt + 1); + } + else + { + fprintf (stderr, + "ld: Output file requires shared library `%s'\n", + missing_filename); + } + free(missing_filename); + + abort (); + } /* If this symbol is not a PLT/GOT, we do not even need to look at it */ is_plt = IS_PLT_SYM (h->root.root.root.string); *** ./gas/config/tc-i386.c.orig Fri Oct 21 21:42:53 1994 --- ./gas/config/tc-i386.c Sun Dec 4 18:15:00 1994 *************** *** 1691,1699 **** insn_size += size; #ifdef BFD_ASSEMBLER if (r_type == BFD_RELOC_32 - && i.imms[n]->X_op == O_symbol && GOT_symbol ! && GOT_symbol == i.imms[n]->X_add_symbol) { r_type = BFD_RELOC_386_GOTPC; i.imms[n]->X_add_number += 3; --- 1691,1701 ---- insn_size += size; #ifdef BFD_ASSEMBLER if (r_type == BFD_RELOC_32 && GOT_symbol ! && GOT_symbol == i.imms[n]->X_add_symbol ! && (i.imms[n]->X_op == O_symbol ! || (i.imms[n]->X_op == O_add ! && i.imms[n]->X_add_symbol -> sy_value.X_op == O_constant))) { r_type = BFD_RELOC_386_GOTPC; i.imms[n]->X_add_number += 3; *************** *** 2420,2435 **** if (fixP->fx_r_type == BFD_RELOC_32_PCREL && fixP->fx_addsy) { value += fixP->fx_where + fixP->fx_frag->fr_address; - #ifdef OBJ_ELF - if (S_GET_SEGMENT (fixP->fx_addsy) != undefined_section) - { - /* Yes, we add the values in twice. This is because - bfd_perform_relocation subtracts them out again. I think - bfd_perform_relocation is broken, but I don't dare change - it. FIXME. */ - value += fixP->fx_where + fixP->fx_frag->fr_address; - } - #endif } /* Fix a few things - the dynamic linker expects certain values here, --- 2422,2427 ---- *** ./gas/Makefile.in.orig Tue Nov 29 11:03:26 1994 --- ./gas/Makefile.in Wed Dec 14 11:42:10 1994 *************** *** 53,59 **** includedir = $(prefix)/include docdir = $(datadir)/doc ! VERSION=2.5.2 SHELL = /bin/sh --- 53,59 ---- includedir = $(prefix)/include docdir = $(datadir)/doc ! VERSION=2.5.2.6 SHELL = /bin/sh *** ./gas/write.c.orig Mon Oct 17 22:12:25 1994 --- ./gas/write.c Fri Nov 11 14:22:41 1994 *************** *** 2271,2276 **** --- 2271,2290 ---- } } + #ifdef OBJ_ELF + if (fixP->fx_r_type == BFD_RELOC_32_PCREL && fixP->fx_addsy) + { + if (S_GET_SEGMENT (fixP->fx_addsy) == this_segment_type) + { + /* Yes, we add the values in twice. This is because + bfd_perform_relocation subtracts them out again. I think + bfd_perform_relocation is broken, but I don't dare change + it. FIXME. */ + add_number += fixP->fx_where + fixP->fx_frag->fr_address; + } + } + #endif + if (!fixP->fx_bit_fixP && size > 0) { valueT mask = 0; *** ./libiberty/basename.c.orig Thu Dec 8 15:15:18 1994 --- ./libiberty/basename.c Thu Dec 8 15:16:11 1994 *************** *** 44,50 **** char * basename (name) ! char *name; { char *base = name; --- 44,50 ---- char * basename (name) ! const char *name; { char *base = name; *** ./ld/ldver.c.orig Tue Nov 29 15:37:17 1994 --- ./ld/ldver.c Wed Dec 14 11:42:39 1994 *************** *** 29,35 **** ldversion (noisy) int noisy; { ! fprintf(stdout,"ld version 2.5.2 (with BFD %s)\n", BFD_VERSION); if (noisy) { --- 29,35 ---- ldversion (noisy) int noisy; { ! fprintf(stdout,"ld version 2.5.2.6 (with BFD %s)\n", BFD_VERSION); if (noisy) { *** ./ld/emultempl/elf32.em.orig Tue Sep 27 20:07:51 1994 --- ./ld/emultempl/elf32.em Sat Nov 12 16:53:49 1994 *************** *** 125,130 **** --- 125,131 ---- if (! bfd_elf32_size_dynamic_sections (output_bfd, command_line.soname, command_line.rpath, + command_line.export_dynamic, &link_info, &sinterp)) einfo ("%P%F: failed to set dynamic section sizes: %E\n"); *************** *** 206,215 **** asection *s; { lang_output_section_statement_type *place; ! asection *snew, **pps; lang_statement_list_type *old; lang_statement_list_type add; etree_type *address; const char *secname, *ps; lang_output_section_statement_type *os; --- 207,217 ---- asection *s; { lang_output_section_statement_type *place; ! asection *snew, **pps, *sec; lang_statement_list_type *old; lang_statement_list_type add; etree_type *address; + int has_dynamic; const char *secname, *ps; lang_output_section_statement_type *os; *************** *** 244,249 **** --- 246,264 ---- return false; secname = bfd_get_section_name (s->owner, s); + + /* In dynamic images, we cannot have orphaned relocation sections. + The .dynamic section will be all wrong, so for now we simply assert + this to be the case. The fix is simple - you need to add the relevant + relocation sections to the linker script so that they get bunched + with the other relocation sections. The .rel.plt must be the last + one always, or you get screwed up for other reasons. */ + + has_dynamic = 0; + for (sec = output_bfd->sections; sec ; sec = sec->next) + if(strcmp(sec->name,".dynamic") == 0) has_dynamic = 1; + + ASSERT(strncmp(secname,".rel",4) || !has_dynamic); /* Create the section in the output file, and put it in the right place. This shuffling to make the output file look neater, and *** ./ld/scripttempl/elf.sc.orig Fri Oct 14 19:15:55 1994 --- ./ld/scripttempl/elf.sc Sat Dec 10 00:54:19 1994 *************** *** 2,10 **** # Unusual variables checked by this code: # NOP - two byte opcode for no-op (defaults to 0) # DATA_ADDR - if end-of-text-plus-one-page isn't right for data start ! # OTHER_READONLY_SECTIONS - other than .text .init .ctors .rodata ... # (e.g., .PARISC.milli) ! # OTHER_READWRITE_SECTIONS - other than .data .bss .sdata ... # (e.g., .PARISC.global) # OTHER_SECTIONS - at the end # EXECUTABLE_SYMBOLS - symbols that must be defined for an --- 2,10 ---- # Unusual variables checked by this code: # NOP - two byte opcode for no-op (defaults to 0) # DATA_ADDR - if end-of-text-plus-one-page isn't right for data start ! # OTHER_READONLY_SECTIONS - other than .text .init .rodata ... # (e.g., .PARISC.milli) ! # OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ... # (e.g., .PARISC.global) # OTHER_SECTIONS - at the end # EXECUTABLE_SYMBOLS - symbols that must be defined for an *************** *** 20,25 **** --- 20,26 ---- # When adding sections, do note that the names of some sections are used # when specifying the start address of the next. # + test -z "$ENTRY" && ENTRY=_start test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT} test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT} test "$LD_FLAG" = "N" && DATA_ADDR=. *************** *** 29,34 **** --- 30,36 ---- OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}", "${LITTLE_OUTPUT_FORMAT}") OUTPUT_ARCH(${ARCH}) + ENTRY(${ENTRY}) ${RELOCATING+${LIB_SEARCH_DIRS}} ${RELOCATING+/* Do we need any of these for elf? *************** *** 59,64 **** --- 61,70 ---- .rela.ctors ${RELOCATING-0} : { *(.rela.ctors) } .rel.dtors ${RELOCATING-0} : { *(.rel.dtors) } .rela.dtors ${RELOCATING-0} : { *(.rela.dtors) } + .rel.init ${RELOCATING-0} : { *(.rel.init) } + .rela.init ${RELOCATING-0} : { *(.rela.init) } + .rel.fini ${RELOCATING-0} : { *(.rel.fini) } + .rela.fini ${RELOCATING-0} : { *(.rela.fini) } .rel.bss ${RELOCATING-0} : { *(.rel.bss) } .rela.bss ${RELOCATING-0} : { *(.rela.bss) } .rel.plt ${RELOCATING-0} : { *(.rel.plt) } *************** *** 68,86 **** .text ${RELOCATING-0} : { ${RELOCATING+${TEXT_START_SYMBOLS}} ! *(.text) ! } ${RELOCATING+_etext = .;} ${RELOCATING+PROVIDE (etext = .);} .fini ${RELOCATING-0} : { *(.fini) } =${NOP-0} - .ctors ${RELOCATING-0} : { *(.ctors) } - .dtors ${RELOCATING-0} : { *(.dtors) } .rodata ${RELOCATING-0} : { *(.rodata) } .rodata1 ${RELOCATING-0} : { *(.rodata1) } ${RELOCATING+${OTHER_READONLY_SECTIONS}} /* Read-write section, merged into data segment: */ - ${RELOCATING+. = ${DATA_ADDR- ALIGN(8) + ${MAXPAGESIZE}};} .data ${RELOCATING-0} : { ${RELOCATING+${DATA_START_SYMBOLS}} --- 74,94 ---- .text ${RELOCATING-0} : { ${RELOCATING+${TEXT_START_SYMBOLS}} ! *(.text) ! } = ${NOP-0} ${RELOCATING+_etext = .;} ${RELOCATING+PROVIDE (etext = .);} .fini ${RELOCATING-0} : { *(.fini) } =${NOP-0} .rodata ${RELOCATING-0} : { *(.rodata) } .rodata1 ${RELOCATING-0} : { *(.rodata1) } ${RELOCATING+${OTHER_READONLY_SECTIONS}} + /* The last page of text may contain the beginning of data + * and the first page of data may contain the end of text. + * We first align to the page boundary. We then add the shift + * due to the extra end of text, but only if necessary. */ + ${RELOCATING+. = ALIGN(${MAXPAGESIZE}) + ((ALIGN(8) + ${MAXPAGESIZE} - ALIGN(${MAXPAGESIZE})) & (${MAXPAGESIZE} - 1));} /* Read-write section, merged into data segment: */ .data ${RELOCATING-0} : { ${RELOCATING+${DATA_START_SYMBOLS}} *************** *** 88,93 **** --- 96,103 ---- ${CONSTRUCTING+CONSTRUCTORS} } .data1 ${RELOCATING-0} : { *(.data1) } + .ctors ${RELOCATING-0} : { *(.ctors) } + .dtors ${RELOCATING-0} : { *(.dtors) } ${RELOCATING+${OTHER_READWRITE_SECTIONS}} .got ${RELOCATING-0} : { *(.got.plt) *(.got) } .dynamic ${RELOCATING-0} : { *(.dynamic) } *** ./ld/ld.h.orig Tue Sep 20 17:15:53 1994 --- ./ld/ld.h Fri Nov 11 14:30:37 1994 *************** *** 61,66 **** --- 61,70 ---- /* Big or little endian as set on command line. */ enum { ENDIAN_UNSET = 0, ENDIAN_BIG, ENDIAN_LITTLE } endian; + + /* If true, export all symbols in the dynamic symbol table of an ELF + executable. */ + boolean export_dynamic; } args_type; extern args_type command_line; *** ./ld/lexsup.c.orig Wed Oct 12 16:26:42 1994 --- ./ld/lexsup.c Sat Dec 3 09:49:23 1994 *************** *** 68,74 **** #define OPTION_DYNAMIC_LINKER (OPTION_DEFSYM + 1) #define OPTION_EB (OPTION_DYNAMIC_LINKER + 1) #define OPTION_EL (OPTION_EB + 1) ! #define OPTION_HELP (OPTION_EL + 1) #define OPTION_IGNORE (OPTION_HELP + 1) #define OPTION_MAP (OPTION_IGNORE + 1) #define OPTION_NO_KEEP_MEMORY (OPTION_MAP + 1) --- 68,75 ---- #define OPTION_DYNAMIC_LINKER (OPTION_DEFSYM + 1) #define OPTION_EB (OPTION_DYNAMIC_LINKER + 1) #define OPTION_EL (OPTION_EB + 1) ! #define OPTION_EXPORT_DYNAMIC (OPTION_EL + 1) ! #define OPTION_HELP (OPTION_EXPORT_DYNAMIC + 1) #define OPTION_IGNORE (OPTION_HELP + 1) #define OPTION_MAP (OPTION_IGNORE + 1) #define OPTION_NO_KEEP_MEMORY (OPTION_MAP + 1) *************** *** 106,111 **** --- 107,113 ---- {"EB", no_argument, NULL, OPTION_EB}, {"EL", no_argument, NULL, OPTION_EL}, {"end-group", no_argument, NULL, ')'}, + {"export-dynamic", no_argument, NULL, OPTION_EXPORT_DYNAMIC}, {"format", required_argument, NULL, 'b'}, {"help", no_argument, NULL, OPTION_HELP}, {"Map", required_argument, NULL, OPTION_MAP}, *************** *** 205,210 **** --- 207,215 ---- case OPTION_EL: command_line.endian = ENDIAN_LITTLE; break; + case OPTION_EXPORT_DYNAMIC: + command_line.export_dynamic = true; + break; case 'e': lang_add_entry (optarg, 1); break; *************** *** 373,380 **** trace_file_tries = true; break; case 'v': - case 'V': ldversion (0); version_printed = true; break; case OPTION_VERSION: --- 378,388 ---- trace_file_tries = true; break; case 'v': ldversion (0); + version_printed = true; + break; + case 'V': + ldversion (1); version_printed = true; break; case OPTION_VERSION: *** ./ld/ldlang.c.orig Tue Sep 20 17:15:58 1994 --- ./ld/ldlang.c Sat Nov 12 12:15:38 1994 *************** *** 2106,2112 **** lang_finish () { struct bfd_link_hash_entry *h; ! boolean warn = link_info.relocateable ? false : true; if (entry_symbol == (char *) NULL) { --- 2106,2112 ---- lang_finish () { struct bfd_link_hash_entry *h; ! boolean warn = (link_info.relocateable || link_info.shared) ? false : true; if (entry_symbol == (char *) NULL) { *** ./include/libiberty.h.orig Wed Aug 10 16:19:49 1994 --- ./include/libiberty.h Thu Dec 8 15:18:00 1994 *************** *** 23,29 **** /* Return the last component of a path name. */ ! extern char *basename PARAMS ((char *)); /* Concatenate an arbitrary number of strings, up to (char *) NULL. Allocates memory using xmalloc. */ --- 23,29 ---- /* Return the last component of a path name. */ ! extern char *basename PARAMS ((const char *)); /* Concatenate an arbitrary number of strings, up to (char *) NULL. Allocates memory using xmalloc. */