diff options
author | Ian Lance Taylor <ian@airs.com> | 1999-08-09 02:56:16 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1999-08-09 02:56:16 +0000 |
commit | 5dccc1ddaa1d8e543c1113a83df73c6d7e6973ec (patch) | |
tree | 67c302c3ec020fbc5b6a6ac27cc7f420848618da /bfd/coffcode.h | |
parent | dc8bc5a62ae63232cc0e42871b398ed8e80c9f05 (diff) | |
download | gdb-5dccc1ddaa1d8e543c1113a83df73c6d7e6973ec.zip gdb-5dccc1ddaa1d8e543c1113a83df73c6d7e6973ec.tar.gz gdb-5dccc1ddaa1d8e543c1113a83df73c6d7e6973ec.tar.bz2 |
1999-08-08 Mark Elbrecht <snowball3@bigfoot.com>
* libcoff-in.h (struct coff_section_alignment_entry): Define.
* coffcode.h (coff_set_custom_section_alignment): New static
function.
(coff_section_alignment_table): New static array.
(coff_new_section_hook): Use coff_set_customer_section_alignment.
* coff-go32.c (COFF_SECTION_ALIGNMENT_ENTRIES): Define.
* coff-stgo32.c (COFF_SECTION_ALIGNMENT_ENTRIES): Define.
* libcoff.h: Rebuild.
Diffstat (limited to 'bfd/coffcode.h')
-rw-r--r-- | bfd/coffcode.h | 92 |
1 files changed, 70 insertions, 22 deletions
diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 301e5f7..1f39394 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -315,6 +315,9 @@ CODE_FRAGMENT static long sec_to_styp_flags PARAMS ((const char *, flagword)); static flagword styp_to_sec_flags PARAMS ((bfd *, PTR, const char *)); static boolean coff_bad_format_hook PARAMS ((bfd *, PTR)); +static void coff_set_custom_section_alignment + PARAMS ((bfd *, asection *, const struct coff_section_alignment_entry *, + unsigned int)); static boolean coff_new_section_hook PARAMS ((bfd *, asection *)); static boolean coff_set_arch_mach_hook PARAMS ((bfd *, PTR)); static boolean coff_write_relocs PARAMS ((bfd *, int)); @@ -1076,15 +1079,73 @@ coff_bad_format_hook (abfd, filehdr) return true; } -/* - initialize a section structure with information peculiar to this - particular implementation of coff -*/ +/* Check whether this section uses an alignment other than the + default. */ + +static void +coff_set_custom_section_alignment (abfd, section, alignment_table, table_size) + bfd *abfd ATTRIBUTE_UNUSED; + asection *section; + const struct coff_section_alignment_entry *alignment_table; + const unsigned int table_size; +{ + const unsigned int default_alignment = COFF_DEFAULT_SECTION_ALIGNMENT_POWER; + unsigned int i; + + for (i = 0; i < table_size; ++i) + { + const char *secname = bfd_get_section_name (abfd, section); + if (alignment_table[i].comparison_length == (unsigned int) -1 + ? strcmp (alignment_table[i].name, secname) == 0 + : strncmp (alignment_table[i].name, secname, + alignment_table[i].comparison_length) == 0) + break; + } + if (i >= table_size) + return; + + if (alignment_table[i].default_alignment_min != COFF_ALIGNMENT_FIELD_EMPTY + && default_alignment < alignment_table[i].default_alignment_min) + return; + + if (alignment_table[i].default_alignment_max != COFF_ALIGNMENT_FIELD_EMPTY + && default_alignment > alignment_table[i].default_alignment_max) + return; + + section->alignment_power = alignment_table[i].alignment_power; +} + +/* Custom section alignment records. */ + +static const struct coff_section_alignment_entry +coff_section_alignment_table[] = +{ +#ifdef COFF_SECTION_ALIGNMENT_ENTRIES + COFF_SECTION_ALIGNMENT_ENTRIES, +#endif + /* There must not be any gaps between .stabstr sections. */ + { COFF_SECTION_NAME_PARTIAL_MATCH (".stabstr"), + 1, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, + /* The .stab section must be aligned to 2**2 at most, to avoid gaps. */ + { COFF_SECTION_NAME_PARTIAL_MATCH (".stab"), + 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, + /* Similarly for the .ctors and .dtors sections. */ + { COFF_SECTION_NAME_EXACT_MATCH (".ctors"), + 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, + { COFF_SECTION_NAME_EXACT_MATCH (".dtors"), + 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 } +}; + +static const unsigned int coff_section_alignment_table_size = + sizeof coff_section_alignment_table / sizeof coff_section_alignment_table[0]; + +/* Initialize a section structure with information peculiar to this + particular implementation of COFF. */ static boolean coff_new_section_hook (abfd, section) - bfd * abfd; - asection * section; + bfd *abfd; + asection *section; { combined_entry_type *native; @@ -1120,22 +1181,9 @@ coff_new_section_hook (abfd, section) coffsymbol (section->symbol)->native = native; - /* The .stab section must be aligned to 2**2 at most, because - otherwise there may be gaps in the section which gdb will not - know how to interpret. Examining the section name is a hack, but - that is also how gdb locates the section. - We need to handle the .ctors and .dtors sections similarly, to - avoid introducing null words in the tables. */ - if (COFF_DEFAULT_SECTION_ALIGNMENT_POWER > 2 - && (strncmp (section->name, ".stab", 5) == 0 - || strcmp (section->name, ".ctors") == 0 - || strcmp (section->name, ".dtors") == 0)) - section->alignment_power = 2; - - /* Similarly, the .stabstr section must be aligned to 2**0 at most. */ - if (COFF_DEFAULT_SECTION_ALIGNMENT_POWER > 0 - && strncmp (section->name, ".stabstr", 8) == 0) - section->alignment_power = 0; + coff_set_custom_section_alignment (abfd, section, + coff_section_alignment_table, + coff_section_alignment_table_size); return true; } |