diff options
author | Alan Modra <amodra@gmail.com> | 2013-02-11 05:30:54 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2013-02-11 05:30:54 +0000 |
commit | 9f7c3e5e99a620b68f6b2d0f3b17329e40b8d781 (patch) | |
tree | b76a4adfbe34ae115c5e61320356fd6944356b85 /bfd/elfcode.h | |
parent | 61087d8c32b44f2a22d6679f8214b7fd660f0b3a (diff) | |
download | fsf-binutils-gdb-9f7c3e5e99a620b68f6b2d0f3b17329e40b8d781.zip fsf-binutils-gdb-9f7c3e5e99a620b68f6b2d0f3b17329e40b8d781.tar.gz fsf-binutils-gdb-9f7c3e5e99a620b68f6b2d0f3b17329e40b8d781.tar.bz2 |
* elfcode.h (elf_checksum_contents): Free contents.
* elf-bfd.h (_bfd_elf_link_hash_table_free): Declare.
* elflink.c (_bfd_elf_link_hash_table_free): New function.
(elf_final_link_free): New function, extracted from..
(bfd_elf_final_link): ..here. Always call
_bfd_elf_write_section_eh_frame_hdr.
* elfxx-target.h (bfd_elfNN_bfd_link_hash_table_free): Default to
_bfd_elf_link_hash_table_free.
* libbfd-in.h (_bfd_merge_sections_free): Declare.
* libbfd.h: Regenerate.
* merge.c (_bfd_merge_sections_free): New function.
* elf-eh-frame.c (_bfd_elf_write_section_eh_frame_hdr): Free
hdr_info->array.
* elf-m10300.c (elf32_mn10300_link_hash_table_free): Call
_bfd_elf_link_hash_table_free.
* elf32-arm.c (elf32_arm_link_hash_table_free): Likewise.
* elf32-avr.c (elf32_avr_link_hash_table_free): Likewise.
* elf32-hppa.c (elf32_hppa_link_hash_table_free): Likewise.
* elf32-i386.c (elf_i386_link_hash_table_free): Likewise.
* elf32-m68hc1x.c (m68hc11_elf_hash_table_free): Likewise.
* elf32-m68k.c (elf_m68k_link_hash_table_free): Likewise.
* elf32-metag.c (elf_metag_link_hash_table_free): Likewise.
* elf32-xgate.c (xgate_elf_bfd_link_hash_table_free): Likewise.
* elf64-aarch64.c (elf64_aarch64_link_hash_table_free): Likewise.
* elf64-ia64-vms.c (elf64_ia64_hash_table_free): Likewise.
* elf64-ppc.c (ppc64_elf_link_hash_table_free): Likewise.
* elf64-x86-64.c (elf_x86_64_link_hash_table_free): Likewise.
* elfnn-ia64.c (elfNN_ia64_hash_table_free): Likewise.
* elf32-cr16.c (elf32_cr16_link_hash_table_free): Delete.
(bfd_elf32_bfd_link_hash_table_free): Don't define.
* elf32-tic6x.c (elf32_tic6x_link_hash_table_free): Delete.
(bfd_elf32_bfd_link_hash_table_free): Dont' define.
Diffstat (limited to 'bfd/elfcode.h')
-rw-r--r-- | bfd/elfcode.h | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/bfd/elfcode.h b/bfd/elfcode.h index 298ba35..63a3306 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -1071,6 +1071,7 @@ elf_checksum_contents (bfd *abfd, { Elf_Internal_Shdr i_shdr; Elf_External_Shdr x_shdr; + bfd_byte *contents, *free_contents; i_shdr = *i_shdrp[count]; i_shdr.sh_offset = 0; @@ -1078,28 +1079,36 @@ elf_checksum_contents (bfd *abfd, elf_swap_shdr_out (abfd, &i_shdr, &x_shdr); (*process) (&x_shdr, sizeof x_shdr, arg); - /* PR ld/12451: - Process the section's contents, if it has some. Read them in if necessary. */ - if (i_shdr.contents) - (*process) (i_shdr.contents, i_shdr.sh_size, arg); - else if (i_shdr.sh_type != SHT_NOBITS) + /* Process the section's contents, if it has some. + PR ld/12451: Read them in if necessary. */ + if (i_shdr.sh_type == SHT_NOBITS) + continue; + free_contents = NULL; + contents = i_shdr.contents; + if (contents == NULL) { asection *sec; sec = bfd_section_from_elf_index (abfd, count); if (sec != NULL) { - if (sec->contents == NULL) + contents = sec->contents; + if (contents == NULL) { /* Force rereading from file. */ sec->flags &= ~SEC_IN_MEMORY; - if (! bfd_malloc_and_get_section (abfd, sec, & sec->contents)) + if (!bfd_malloc_and_get_section (abfd, sec, &free_contents)) continue; + contents = free_contents; } - if (sec->contents != NULL) - (*process) (sec->contents, i_shdr.sh_size, arg); } } + if (contents != NULL) + { + (*process) (contents, i_shdr.sh_size, arg); + if (free_contents != NULL) + free (free_contents); + } } return TRUE; |