diff options
author | Alan Modra <amodra@gmail.com> | 2022-12-16 21:37:29 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-12-17 18:44:42 +1030 |
commit | 56ba7527d29060cf6e8693d6e772a9b9b53c1373 (patch) | |
tree | 793cd025443d0fc7d91b52f7e50746ce9c814740 /bfd/simple.c | |
parent | 6f00d50e2b6445f88b5f362dbbd982f387b6354f (diff) | |
download | binutils-56ba7527d29060cf6e8693d6e772a9b9b53c1373.zip binutils-56ba7527d29060cf6e8693d6e772a9b9b53c1373.tar.gz binutils-56ba7527d29060cf6e8693d6e772a9b9b53c1373.tar.bz2 |
bfd_get_relocated_section_contents allow NULL data buffer
This patch removes the bfd_malloc in default_indirect_link_order and
bfd_simple_get_relocated_section_contents, pushing the allocation down
to bfd_get_relocated_section_contents. The idea is to make use of the
allocation done with sanity checking in bfd_get_full_section_contents,
which is called by bfd_generic_get_relocated_section_contents.
Doing this exposed a bug in bfd_get_full_section_contents. With
relaxation it is possible that an input section rawsize is different
to the section size. In that case we want to use the larger of
rawsize (the on-disk size for input sections) and size.
* reloc.c (bfd_generic_get_relocated_section_contents),
* reloc16.c (bfd_coff_reloc16_get_relocated_section_contents),
* coff-alpha.c (alpha_ecoff_get_relocated_section_contents),
* coff-sh.c (sh_coff_get_relocated_section_contents),
* elf-m10200.c (mn10200_elf_get_relocated_section_contents),
* elf-m10300.c (mn10300_elf_get_relocated_section_contents),
* elf32-avr.c (elf32_avr_get_relocated_section_contents),
* elf32-cr16.c (elf32_cr16_get_relocated_section_contents),
* elf32-crx.c (elf32_crx_get_relocated_section_contents),
* elf32-h8300.c (elf32_h8_get_relocated_section_contents),
* elf32-nds32.c (nds32_elf_get_relocated_section_contents),
* elf32-sh.c (sh_elf_get_relocated_section_contents),
* elfxx-mips.c (_bfd_elf_mips_get_relocated_section_contents):
Handle NULL data buffer.
* bfd.c (bfd_get_section_alloc_size): New function.
* bfd-in2.h: Regenerate.
* compress.c (bfd_get_full_section_contents): Correct section
malloc size.
* linker.c (default_indirect_link_order): Don't malloc memory
here before calling bfd_get_relocated_section_contents.
* simple.c (bfd_simple_get_relocated_section_contents): Likewise.
Diffstat (limited to 'bfd/simple.c')
-rw-r--r-- | bfd/simple.c | 20 |
1 files changed, 4 insertions, 16 deletions
diff --git a/bfd/simple.c b/bfd/simple.c index 67e326d..4c8b058 100644 --- a/bfd/simple.c +++ b/bfd/simple.c @@ -209,7 +209,7 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, struct bfd_link_info link_info; struct bfd_link_order link_order; struct bfd_link_callbacks callbacks; - bfd_byte *contents, *data; + bfd_byte *contents; struct saved_offsets saved_offsets; bfd *link_next; @@ -257,28 +257,19 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, link_order.size = sec->size; link_order.u.indirect.section = sec; - data = NULL; contents = NULL; - if (outbuf == NULL) - { - bfd_size_type amt = sec->rawsize > sec->size ? sec->rawsize : sec->size; - data = (bfd_byte *) bfd_malloc (amt); - if (data == NULL) - goto out1; - outbuf = data; - } saved_offsets.section_count = abfd->section_count; saved_offsets.sections = malloc (sizeof (*saved_offsets.sections) * saved_offsets.section_count); if (saved_offsets.sections == NULL) - goto out2; + goto out1; bfd_map_over_sections (abfd, simple_save_output_info, &saved_offsets); if (symbol_table == NULL) { if (!bfd_generic_link_read_symbols (abfd)) - goto out3; + goto out2; symbol_table = _bfd_generic_link_get_symbols (abfd); } @@ -288,12 +279,9 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, outbuf, false, symbol_table); - out3: + out2: bfd_map_over_sections (abfd, simple_restore_output_info, &saved_offsets); free (saved_offsets.sections); - out2: - if (contents == NULL) - free (data); out1: _bfd_generic_link_hash_table_free (abfd); abfd->link.next = link_next; |