diff options
author | Hans-Peter Nilsson <hp@bitrange.com> | 2015-10-22 09:32:30 +0200 |
---|---|---|
committer | Hans-Peter Nilsson <hp@bitrange.com> | 2015-10-22 16:17:32 +0200 |
commit | c287bfe4297ec9c12db292fae5562be1758cf14f (patch) | |
tree | 264d7d09008838c2ebb73c4d06e97e2f4f2ad580 /bfd/mmo.c | |
parent | 282b7d7b65e928a59464b2a9a5e75555c97481dc (diff) | |
download | gdb-c287bfe4297ec9c12db292fae5562be1758cf14f.zip gdb-c287bfe4297ec9c12db292fae5562be1758cf14f.tar.gz gdb-c287bfe4297ec9c12db292fae5562be1758cf14f.tar.bz2 |
bfd/mmo.c: handle "objcopy --extract-symbols" generating and reading back.
bfd:
* mmo.c (struct mmo_data_struct): New members
symbol_consistency_override_calculated and ignore_symbol_consistency.
(mmo_section_has_contents, mmo_ignore_symbol_consistency): New
functions.
(mmo_create_symbol): Check with mmo_ignore_symbol_consistency if to
report an error for unexpected value of Main.
(mmo_write_symbols_and_terminator): Similar.
Diffstat (limited to 'bfd/mmo.c')
-rw-r--r-- | bfd/mmo.c | 44 |
1 files changed, 41 insertions, 3 deletions
@@ -330,6 +330,14 @@ struct mmo_data_struct /* We also need a buffer to hold the bytes we count reading or writing. */ bfd_byte buf[4]; + + /* Whether we've calculated symbol consistency requirement yet. We do this + when-needed, which must be at some time after all section + contents is known. */ + bfd_boolean symbol_consistency_override_calculated; + + /* Whether to consistency-check symbol values, in particular "Main". */ + bfd_boolean ignore_symbol_consistency; }; typedef struct mmo_data_struct tdata_type; @@ -586,6 +594,34 @@ mmo_mkobject (bfd *abfd) } static bfd_boolean +mmo_section_has_contents (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *p ATTRIBUTE_UNUSED) +{ + /* The point is to match what --extract-symbols does (well, negated). */ + return bfd_get_section_size (sec) != 0; +} + +/* Find out whether we should omit symbol consistency checks for this + bfd and cache the value. + + This function must only be called when all section contents is + known. However, calculating symbol consistency at the time the + private BFD data is initialized is too late for some uses. */ + +static bfd_boolean +mmo_ignore_symbol_consistency (bfd *abfd) +{ + if (!abfd->tdata.mmo_data->symbol_consistency_override_calculated) + { + abfd->tdata.mmo_data->ignore_symbol_consistency = + bfd_sections_find_if (abfd, mmo_section_has_contents, NULL) == NULL; + + abfd->tdata.mmo_data->symbol_consistency_override_calculated = TRUE; + } + + return abfd->tdata.mmo_data->ignore_symbol_consistency; +} + +static bfd_boolean mmo_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd) { if (bfd_get_flavour (ibfd) != bfd_target_mmo_flavour @@ -1208,7 +1244,8 @@ mmo_create_symbol (bfd *abfd, const char *symname, bfd_vma addr, enum object. For written objects, we do it while setting the symbol table. */ if (strcmp (symname, MMIX_START_SYMBOL_NAME) == 0 - && bfd_get_start_address (abfd) != addr) + && bfd_get_start_address (abfd) != addr + && !mmo_ignore_symbol_consistency (abfd)) { (*_bfd_error_handler) (_("%s: invalid mmo file: initialization value for $255 is not `Main'\n"), @@ -2900,13 +2937,14 @@ mmo_write_symbols_and_terminator (bfd *abfd) = (mainsym->value + mainsym->section->output_section->vma + mainsym->section->output_offset); - memcpy (table + 1, orig_table, i * sizeof (asymbol *)); + memcpy (table + 1, orig_table, i * sizeof (asymbol *)); table[0] = mainsym; /* Check that the value assigned to :Main is the same as the entry address. The default linker script asserts this. This is as good a place as any to check this consistency. */ - if (mainvalue != bfd_get_start_address (abfd)) + if (mainvalue != bfd_get_start_address (abfd) + && !mmo_ignore_symbol_consistency (abfd)) { /* Arbitrary buffer to hold the printable representation of a vma. */ |