X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fcoffcode.h;h=d58d8b001f2177af27390743eb859ed16a6d3f05;hb=911d08a746f9e05c389a7a5044870cd9aae06a5d;hp=b8dde1ab28805bcf0fa8f25b34a94796122243ba;hpb=f9f3cf656a6cd88a51cf53e060f68d6cadeb9ab5;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coffcode.h b/bfd/coffcode.h index b8dde1ab28..d58d8b001f 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -1,6 +1,6 @@ /* Support for the generic parts of most COFF variants, for BFD. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003 + 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Written by Cygnus Support. @@ -309,6 +309,9 @@ CODE_FRAGMENT #define STRING_SIZE_SIZE (4) +#define DOT_DEBUG ".debug" +#define GNU_LINKONCE_WI ".gnu.linkonce.wi." + static long sec_to_styp_flags PARAMS ((const char *, flagword)); static bfd_boolean styp_to_sec_flags @@ -333,7 +336,7 @@ static bfd_boolean coff_compute_section_file_positions static bfd_boolean coff_write_object_contents PARAMS ((bfd *)) ATTRIBUTE_UNUSED; static bfd_boolean coff_set_section_contents - PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type)); + PARAMS ((bfd *, asection *, const PTR, file_ptr, bfd_size_type)); static PTR buy_and_read PARAMS ((bfd *, file_ptr, bfd_size_type)); static bfd_boolean coff_slurp_line_table @@ -428,7 +431,7 @@ sec_to_styp_flags (sec_name, sec_flags) styp_flags = STYP_LIT; #endif /* _LIT */ } - else if (!strncmp (sec_name, ".debug", 6)) + else if (!strncmp (sec_name, DOT_DEBUG, sizeof (DOT_DEBUG) - 1)) { /* Handle the XCOFF debug section and DWARF2 debug sections. */ if (!sec_name[6]) @@ -441,7 +444,7 @@ sec_to_styp_flags (sec_name, sec_flags) styp_flags = STYP_DEBUG_INFO; } #ifdef COFF_LONG_SECTION_NAMES - else if (!strncmp (sec_name, ".gnu.linkonce.wi.", 17)) + else if (!strncmp (sec_name, GNU_LINKONCE_WI, sizeof (GNU_LINKONCE_WI) - 1)) { styp_flags = STYP_DEBUG_INFO; } @@ -518,7 +521,7 @@ sec_to_styp_flags (sec_name, sec_flags) static long sec_to_styp_flags (sec_name, sec_flags) - const char *sec_name ATTRIBUTE_UNUSED; + const char *sec_name; flagword sec_flags; { long styp_flags = 0; @@ -531,6 +534,11 @@ sec_to_styp_flags (sec_name, sec_flags) PE files. The STYP_* flags and the IMAGE_SCN_* flags overlap, but there are more IMAGE_SCN_* flags. */ + /* FIXME: There is no gas syntax to specify the debug section flag. */ + if (strncmp (sec_name, DOT_DEBUG, sizeof (DOT_DEBUG) - 1) == 0 + || strncmp (sec_name, GNU_LINKONCE_WI, sizeof (GNU_LINKONCE_WI) - 1) == 0) + sec_flags = SEC_READONLY | SEC_DEBUGGING; + /* skip LOAD */ /* READONLY later */ /* skip RELOC */ @@ -675,12 +683,12 @@ styp_to_sec_flags (abfd, hdr, name, section, flags_ptr) #endif sec_flags |= SEC_ALLOC; } - else if (strncmp (name, ".debug", 6) == 0 + else if (strncmp (name, DOT_DEBUG, sizeof (DOT_DEBUG) - 1) == 0 #ifdef _COMMENT || strcmp (name, _COMMENT) == 0 #endif #ifdef COFF_LONG_SECTION_NAMES - || strncmp (name, ".gnu.linkonce.wi.", 17) == 0 + || strncmp (name, GNU_LINKONCE_WI, sizeof (GNU_LINKONCE_WI) - 1) == 0 #endif || strncmp (name, ".stab", 5) == 0) { @@ -1064,7 +1072,11 @@ styp_to_sec_flags (abfd, hdr, name, section, flags_ptr) sec_flags &= ~ SEC_READONLY; break; case IMAGE_SCN_MEM_DISCARDABLE: - sec_flags |= SEC_DEBUGGING; + /* The MS PE spec sets the DISCARDABLE flag on .reloc sections + but we do not want them to be labelled as debug section, since + then strip would remove them. */ + if (strncmp (name, ".reloc", sizeof ".reloc" - 1) != 0) + sec_flags |= SEC_DEBUGGING; break; case IMAGE_SCN_MEM_SHARED: sec_flags |= SEC_SHARED; @@ -1572,7 +1584,7 @@ coff_new_section_hook (abfd, section) return FALSE; /* We don't need to set up n_name, n_value, or n_scnum in the native - symbol information, since they'll be overriden by the BFD symbol + symbol information, since they'll be overridden by the BFD symbol anyhow. However, we do need to set the type and storage class, in case this symbol winds up getting written out. The value 0 for n_numaux is already correct. */ @@ -1694,15 +1706,21 @@ coff_set_alignment_hook (abfd, section, scnhdr) struct external_reloc dst; struct internal_reloc n; file_ptr oldpos = bfd_tell (abfd); + bfd_size_type relsz = bfd_coff_relsz (abfd); + bfd_seek (abfd, (file_ptr) hdr->s_relptr, 0); - if (bfd_bread ((PTR) &dst, (bfd_size_type) bfd_coff_relsz (abfd), abfd) - != bfd_coff_relsz (abfd)) + if (bfd_bread ((PTR) &dst, relsz, abfd) != relsz) return; coff_swap_reloc_in (abfd, &dst, &n); bfd_seek (abfd, oldpos, 0); - section->reloc_count = hdr->s_nreloc = n.r_vaddr; + section->reloc_count = hdr->s_nreloc = n.r_vaddr - 1; + section->rel_filepos += relsz; } + else if (hdr->s_nreloc == 0xffff) + (*_bfd_error_handler) + ("%s: warning: claims to have 0xffff relocs, without overflow", + bfd_get_filename (abfd)); } #undef ALIGN_SET #undef ELIFALIGN_SET @@ -2994,7 +3012,7 @@ coff_compute_section_file_positions (abfd) { asection *dsec; - dsec = bfd_make_section_old_way (abfd, ".debug"); + dsec = bfd_make_section_old_way (abfd, DOT_DEBUG); if (dsec == NULL) abort (); dsec->_raw_size = sz; @@ -3008,6 +3026,11 @@ coff_compute_section_file_positions (abfd) if (coff_data (abfd)->link_info) { page_size = pe_data (abfd)->pe_opthdr.FileAlignment; + + /* If no file alignment has been set, default to one. + This repairs 'ld -r' for arm-wince-pe target. */ + if (page_size == 0) + page_size = 1; } else page_size = PE_DEF_FILE_ALIGNMENT; @@ -3871,6 +3894,8 @@ coff_write_object_contents (abfd) #ifdef COFF_IMAGE_WITH_PE if (! hasdebug) internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED; + if (pe_data (abfd)->real_flags & IMAGE_FILE_LARGE_ADDRESS_AWARE) + internal_f.f_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE; #endif #ifdef COFF_WITH_PE @@ -4107,17 +4132,17 @@ coff_write_object_contents (abfd) if (text_sec) { - internal_a.tsize = bfd_get_section_size_before_reloc (text_sec); + internal_a.tsize = bfd_get_section_size (text_sec); internal_a.text_start = internal_a.tsize ? text_sec->vma : 0; } if (data_sec) { - internal_a.dsize = bfd_get_section_size_before_reloc (data_sec); + internal_a.dsize = bfd_get_section_size (data_sec); internal_a.data_start = internal_a.dsize ? data_sec->vma : 0; } if (bss_sec) { - internal_a.bsize = bfd_get_section_size_before_reloc (bss_sec); + internal_a.bsize = bfd_get_section_size (bss_sec); if (internal_a.bsize && bss_sec->vma < internal_a.data_start) internal_a.data_start = bss_sec->vma; } @@ -4265,7 +4290,7 @@ static bfd_boolean coff_set_section_contents (abfd, section, location, offset, count) bfd * abfd; sec_ptr section; - PTR location; + const PTR location; file_ptr offset; bfd_size_type count; { @@ -4407,6 +4432,13 @@ coff_slurp_line_table (abfd, asect) amt = (bfd_size_type) bfd_coff_linesz (abfd) * asect->lineno_count; native_lineno = (LINENO *) buy_and_read (abfd, asect->line_filepos, amt); + if (native_lineno == NULL) + { + (*_bfd_error_handler) + (_("%s: warning: line number table read failed"), + bfd_archive_filename (abfd)); + return FALSE; + } amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent); lineno_cache = (alent *) bfd_alloc (abfd, amt); if (lineno_cache == NULL) @@ -4668,7 +4700,7 @@ coff_slurp_symbol_table (abfd) #endif case C_REGPARM: /* Register parameter. */ case C_REG: /* register variable. */ - /* C_AUTOARG conflictes with TI COFF C_UEXT. */ + /* C_AUTOARG conflicts with TI COFF C_UEXT. */ #if !defined (TIC80COFF) && !defined (TICOFF) #ifdef C_AUTOARG case C_AUTOARG: /* 960-specific storage class. */ @@ -5109,7 +5141,6 @@ static reloc_howto_type *coff_rtype_to_howto struct coff_link_hash_entry *, struct internal_syment *, bfd_vma *)); -/*ARGSUSED*/ static reloc_howto_type * coff_rtype_to_howto (abfd, sec, rel, h, sym, addendp) bfd *abfd ATTRIBUTE_UNUSED; @@ -5480,6 +5511,10 @@ static const bfd_coff_backend_data ticoff1_swap_table = #define coff_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data #endif +#ifndef coff_bfd_copy_private_header_data +#define coff_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data +#endif + #ifndef coff_bfd_copy_private_section_data #define coff_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data #endif @@ -5535,6 +5570,10 @@ static const bfd_coff_backend_data ticoff1_swap_table = #define coff_bfd_merge_sections bfd_generic_merge_sections #endif +#ifndef coff_bfd_is_group_section +#define coff_bfd_is_group_section bfd_generic_is_group_section +#endif + #ifndef coff_bfd_discard_group #define coff_bfd_discard_group bfd_generic_discard_group #endif