From 00692651e0142d5a0d6213567ad234804d28fef4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 18 Aug 1999 06:00:13 +0000 Subject: [PATCH] 1999-08-18 Donn Terry * coff-i386.c (coff_i386_reloc): Handle R_IMAGEBASE. (RTYPE2HOWTO): Return NULL if reloc type is out of range. (coff_i386_rtype_to_howto): Likewise. * coffcode.h (coff_slurp_symbol_table): Change a -2 to N_DEBUG. Completely ignore symbols which are all zero. (dummy_reloc16_estimate): Add return 0. * cofflink.c (_bfd_coff_link_input_bfd): Rename inner scope variable copy to name_copy to avoid shadowing outer scope variable. * libcoff-in.h (coff_data_type): Change raw_syment_count field from unsigned int to unsigned long. Add timestamp field. * libcoff.h: Rebuild. Also comment changes. --- bfd/ChangeLog | 15 +++++++++++++++ bfd/coff-i386.c | 35 +++++++++++++++++++++++++---------- bfd/coffcode.h | 30 +++++++++++++++++++++++------- bfd/cofflink.c | 11 ++++++----- bfd/libcoff-in.h | 5 ++++- bfd/libcoff.h | 5 ++++- 6 files changed, 77 insertions(+), 24 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 945cfb17b1..ebdc802598 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,18 @@ +1999-08-18 Donn Terry + + * coff-i386.c (coff_i386_reloc): Handle R_IMAGEBASE. + (RTYPE2HOWTO): Return NULL if reloc type is out of range. + (coff_i386_rtype_to_howto): Likewise. + * coffcode.h (coff_slurp_symbol_table): Change a -2 to N_DEBUG. + Completely ignore symbols which are all zero. + (dummy_reloc16_estimate): Add return 0. + * cofflink.c (_bfd_coff_link_input_bfd): Rename inner scope + variable copy to name_copy to avoid shadowing outer scope + variable. + * libcoff-in.h (coff_data_type): Change raw_syment_count field + from unsigned int to unsigned long. Add timestamp field. + * libcoff.h: Rebuild. + 1999-08-17 H.J. Lu * elf32-hppa.c (bfd_elf32_bfd_is_local_label_name): Fix typo in diff --git a/bfd/coff-i386.c b/bfd/coff-i386.c index 0d10fe2bca..e686b7b6cc 100644 --- a/bfd/coff-i386.c +++ b/bfd/coff-i386.c @@ -42,8 +42,10 @@ static bfd_reloc_status_type coff_i386_reloc static reloc_howto_type *coff_i386_rtype_to_howto PARAMS ((bfd *, asection *, struct internal_reloc *, struct coff_link_hash_entry *, struct internal_syment *, - bfd_vma *)); +static reloc_howto_type *coff_i386_reloc_type_lookup + PARAMS ((bfd *, bfd_reloc_code_real_type)); +static const bfd_target *i3coff_object_p PARAMS ((bfd *)); #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2) /* The page size is a guess based on ELF. */ @@ -106,8 +108,8 @@ coff_i386_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd, #ifdef COFF_WITH_PE /* FIXME: How should this case be handled? */ - if (reloc_entry->howto->type == R_IMAGEBASE && diff != 0) - abort (); + if (reloc_entry->howto->type == R_IMAGEBASE) + diff -= pe_data (output_bfd)->pe_opthdr.ImageBase; #endif #define DOIT(x) \ @@ -190,7 +192,7 @@ static reloc_howto_type howto_table[] = 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ true), /* pcrel_offset */ - /* {7}, */ + /* PE IMAGE_REL_I386_DIR32NB relocation (7). */ HOWTO (R_IMAGEBASE, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ @@ -211,7 +213,8 @@ static reloc_howto_type howto_table[] = EMPTY_HOWTO (014), EMPTY_HOWTO (015), EMPTY_HOWTO (016), - HOWTO (R_RELBYTE, /* type */ + /* Byte relocation (017). */ + HOWTO (R_RELBYTE, /* type */ 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ 8, /* bitsize */ @@ -224,6 +227,7 @@ static reloc_howto_type howto_table[] = 0x000000ff, /* src_mask */ 0x000000ff, /* dst_mask */ PCRELOFFSET), /* pcrel_offset */ + /* 16-bit word relocation (020). */ HOWTO (R_RELWORD, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ @@ -237,6 +241,7 @@ static reloc_howto_type howto_table[] = 0x0000ffff, /* src_mask */ 0x0000ffff, /* dst_mask */ PCRELOFFSET), /* pcrel_offset */ + /* 32-bit longword relocation (021). */ HOWTO (R_RELLONG, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ @@ -250,6 +255,7 @@ static reloc_howto_type howto_table[] = 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ PCRELOFFSET), /* pcrel_offset */ + /* Byte PC relative relocation (022). */ HOWTO (R_PCRBYTE, /* type */ 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ @@ -263,6 +269,7 @@ static reloc_howto_type howto_table[] = 0x000000ff, /* src_mask */ 0x000000ff, /* dst_mask */ PCRELOFFSET), /* pcrel_offset */ + /* 16-bit word PC relative relocation (023). */ HOWTO (R_PCRWORD, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ @@ -276,6 +283,7 @@ static reloc_howto_type howto_table[] = 0x0000ffff, /* src_mask */ 0x0000ffff, /* dst_mask */ PCRELOFFSET), /* pcrel_offset */ + /* 32-bit longword PC relative relocation (024). */ HOWTO (R_PCRLONG, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ @@ -297,8 +305,11 @@ static reloc_howto_type howto_table[] = #define BADMAG(x) I386BADMAG(x) #define I386 1 /* Customize coffcode.h */ -#define RTYPE2HOWTO(cache_ptr, dst) \ - (cache_ptr)->howto = howto_table + (dst)->r_type; +#define RTYPE2HOWTO(cache_ptr, dst) \ + ((cache_ptr)->howto = \ + ((dst)->r_type < sizeof (howto_table) / sizeof (howto_table[0]) \ + ? howto_table + (dst)->r_type \ + : NULL)) /* For 386 COFF a STYP_NOLOAD | STYP_BSS section is part of a shared library. On some other COFF targets STYP_BSS is normally @@ -392,12 +403,18 @@ coff_i386_rtype_to_howto (abfd, sec, rel, h, sym, addendp) struct internal_syment *sym; bfd_vma *addendp; { - reloc_howto_type *howto; + if (rel->r_type > sizeof (howto_table) / sizeof (howto_table[0])) + { + bfd_set_error (bfd_error_bad_value); + return NULL; + } + howto = howto_table + rel->r_type; #ifdef COFF_WITH_PE + /* Cancel out code in _bfd_coff_generic_relocate_section. */ *addendp = 0; #endif @@ -458,10 +475,8 @@ coff_i386_rtype_to_howto (abfd, sec, rel, h, sym, addendp) return howto; } - #define coff_bfd_reloc_type_lookup coff_i386_reloc_type_lookup - static reloc_howto_type * coff_i386_reloc_type_lookup (abfd, code) bfd *abfd ATTRIBUTE_UNUSED; diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 1f393946dc..b87e8144bb 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -131,7 +131,7 @@ SUBSUBSECTION moment. To port BFD, that person will have to add more @code{#defines}. Three of the bit twiddling routines are exported to @code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in} - and @code{coff_swap_linno_in}. @code{GDB} reads the symbol + and @code{coff_swap_lineno_in}. @code{GDB} reads the symbol table on its own, but uses BFD to fix things up. More of the bit twiddlers are exported for @code{gas}; @code{coff_swap_aux_out}, @code{coff_swap_sym_out}, @@ -2749,7 +2749,7 @@ coff_write_object_contents (abfd) #ifdef COFF_LONG_SECTION_NAMES /* Handle long section names as in PE. This must be compatible - with the code in coff_write_symbols. */ + with the code in coff_write_symbols and _bfd_coff_final_link. */ { size_t len; @@ -2844,10 +2844,11 @@ coff_write_object_contents (abfd) #endif #ifdef COFF_IMAGE_WITH_PE - /* suppress output of the sections if they are null. ld includes - the bss and data sections even if there is no size assigned - to them. NT loader doesn't like it if these section headers are - included if the sections themselves are not needed */ + /* Suppress output of the sections if they are null. ld + includes the bss and data sections even if there is no size + assigned to them. NT loader doesn't like it if these section + headers are included if the sections themselves are not + needed. See also coff_compute_section_file_positions. */ if (section.s_size == 0) internal_f.f_nscns--; else @@ -3472,6 +3473,9 @@ SUBSUBSECTION base of the line number information for the table is stored in the symbol associated with the function. + Note: The PE format uses line number 0 for a flag indicating a + new source file. + The information is copied from the external to the internal table, and each symbol which marks a function is marked by pointing its... @@ -3561,6 +3565,10 @@ coff_slurp_line_table (abfd, asect) return true; } +/* Slurp in the symbol table, converting it to generic form. Note + that if coff_relocate_section is defined, the linker will read + symbols via coff_link_add_symbols, rather than via this routine. */ + static boolean coff_slurp_symbol_table (abfd) bfd * abfd; @@ -3726,7 +3734,7 @@ coff_slurp_symbol_table (abfd) case C_THUMBSTATFUNC:/* Thumb static function */ #endif case C_LABEL: /* label */ - if (src->u.syment.n_scnum == -2) + if (src->u.syment.n_scnum == N_DEBUG) dst->symbol.flags = BSF_DEBUGGING; else dst->symbol.flags = BSF_LOCAL; @@ -3854,6 +3862,13 @@ coff_slurp_symbol_table (abfd) break; case C_NULL: + /* PE DLLs sometimes have zeroed out symbols for some + reason. Just ignore them without a warning. */ + if (src->u.syment.n_type == 0 + && src->u.syment.n_value == 0 + && src->u.syment.n_scnum == 0) + break; + /* Fall through. */ case C_EXTDEF: /* external definition */ case C_ULABEL: /* undefined label */ case C_USTATIC: /* undefined static */ @@ -4269,6 +4284,7 @@ dummy_reloc16_estimate (abfd, input_section, reloc, shrink, link_info) struct bfd_link_info *link_info ATTRIBUTE_UNUSED; { abort (); + return 0; } #endif diff --git a/bfd/cofflink.c b/bfd/cofflink.c index c9d23f23d3..3df9e23a72 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -1523,7 +1523,7 @@ _bfd_coff_link_input_bfd (finfo, input_bfd) { const char *elename; char elebuf[SYMNMLEN + 1]; - char *copy; + char *name_copy; bfd_coff_swap_sym_in (input_bfd, (PTR) esl, (PTR) islp); @@ -1538,12 +1538,13 @@ _bfd_coff_link_input_bfd (finfo, input_bfd) if (elename == NULL) return false; - copy = (char *) bfd_alloc (input_bfd, strlen (elename) + 1); - if (copy == NULL) + name_copy = (char *) bfd_alloc (input_bfd, + strlen (elename) + 1); + if (name_copy == NULL) return false; - strcpy (copy, elename); + strcpy (name_copy, elename); - (*epp)->name = copy; + (*epp)->name = name_copy; (*epp)->type = islp->n_type; (*epp)->tagndx = 0; if (islp->n_numaux >= 1 diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h index a0362ca9f1..790eeb0342 100644 --- a/bfd/libcoff-in.h +++ b/bfd/libcoff-in.h @@ -56,7 +56,7 @@ typedef struct coff_tdata file_ptr sym_filepos; struct coff_ptr_struct *raw_syments; - unsigned int raw_syment_count; + unsigned long raw_syment_count; /* These are only valid once writing has begun */ long int relocbase; @@ -97,6 +97,9 @@ typedef struct coff_tdata /* Used by coff_find_nearest_line. */ PTR line_info; + /* The timestamp from the COFF file header. */ + long timestamp; + /* Copy of some of the f_flags bits in the COFF filehdr structure, used by ARM code. */ flagword flags; diff --git a/bfd/libcoff.h b/bfd/libcoff.h index fb3d5be73d..5b3d703d11 100644 --- a/bfd/libcoff.h +++ b/bfd/libcoff.h @@ -56,7 +56,7 @@ typedef struct coff_tdata file_ptr sym_filepos; struct coff_ptr_struct *raw_syments; - unsigned int raw_syment_count; + unsigned long raw_syment_count; /* These are only valid once writing has begun */ long int relocbase; @@ -97,6 +97,9 @@ typedef struct coff_tdata /* Used by coff_find_nearest_line. */ PTR line_info; + /* The timestamp from the COFF file header. */ + long timestamp; + /* Copy of some of the f_flags bits in the COFF filehdr structure, used by ARM code. */ flagword flags;