diff options
-rw-r--r-- | bfd/bfd-in2.h | 9 | ||||
-rw-r--r-- | bfd/compress.c | 70 | ||||
-rw-r--r-- | bfd/elf.c | 95 | ||||
-rw-r--r-- | bfd/section.c | 4 | ||||
-rw-r--r-- | binutils/objcopy.c | 9 |
5 files changed, 85 insertions, 102 deletions
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 24f9305..d983268 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -932,10 +932,6 @@ typedef struct bfd_section TMS320C54X only. */ #define SEC_TIC54X_BLOCK 0x10000000 - /* This section should be renamed. This is for ELF linker - internal use only. */ -#define SEC_ELF_RENAME 0x10000000 - /* Conditionally link this section; do not link if there are no references found to any symbol in the section. This is for TI TMS320C54X only. */ @@ -7982,8 +7978,9 @@ void bfd_update_compression_header int bfd_get_compression_header_size (bfd *abfd, asection *sec); -bfd_size_type bfd_convert_section_size - (bfd *ibfd, asection *isec, bfd *obfd, bfd_size_type size); +bool bfd_convert_section_setup + (bfd *ibfd, asection *isec, bfd *obfd, + const char **new_name, bfd_size_type *new_size); bool bfd_convert_section_contents (bfd *ibfd, asection *isec, bfd *obfd, diff --git a/bfd/compress.c b/bfd/compress.c index a4e6a8e..bb55a6e 100644 --- a/bfd/compress.c +++ b/bfd/compress.c @@ -225,53 +225,89 @@ bfd_get_compression_header_size (bfd *abfd, asection *sec) /* FUNCTION - bfd_convert_section_size + bfd_convert_section_setup SYNOPSIS - bfd_size_type bfd_convert_section_size - (bfd *ibfd, asection *isec, bfd *obfd, bfd_size_type size); + bool bfd_convert_section_setup + (bfd *ibfd, asection *isec, bfd *obfd, + const char **new_name, bfd_size_type *new_size); DESCRIPTION - Convert the size @var{size} of the section @var{isec} in input - BFD @var{ibfd} to the section size in output BFD @var{obfd}. + Do early setup for objcopy, when copying @var{isec} in input + BFD @var{ibfd} to output BFD @var{obfd}. Returns the name and + size of the output section. */ -bfd_size_type -bfd_convert_section_size (bfd *ibfd, sec_ptr isec, bfd *obfd, - bfd_size_type size) +bool +bfd_convert_section_setup (bfd *ibfd, asection *isec, bfd *obfd, + const char **new_name, bfd_size_type *new_size) { bfd_size_type hdr_size; + if ((isec->flags & SEC_DEBUGGING) != 0 + && (isec->flags & SEC_HAS_CONTENTS) != 0) + { + const char *name = *new_name; + + if ((ibfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)) != 0) + { + /* When we decompress or compress with SHF_COMPRESSED, + convert section name from .zdebug_* to .debug_*. */ + if (startswith (name, ".zdebug_")) + { + name = bfd_zdebug_name_to_debug (obfd, name); + if (name == NULL) + return false; + } + } + + /* PR binutils/18087: Compression does not always make a + section smaller. So only rename the section when + compression has actually taken place. If input section + name is .zdebug_*, we should never compress it again. */ + else if (isec->compress_status == COMPRESS_SECTION_DONE + && startswith (name, ".debug_")) + { + name = bfd_debug_name_to_zdebug (obfd, name); + if (name == NULL) + return false; + } + *new_name = name; + } + *new_size = bfd_section_size (isec); + /* Do nothing if either input or output aren't ELF. */ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour || bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return size; + return true; /* Do nothing if ELF classes of input and output are the same. */ if (get_elf_backend_data (ibfd)->s->elfclass == get_elf_backend_data (obfd)->s->elfclass) - return size; + return true; /* Convert GNU property size. */ if (startswith (isec->name, NOTE_GNU_PROPERTY_SECTION_NAME)) - return _bfd_elf_convert_gnu_property_size (ibfd, obfd); + { + *new_size = _bfd_elf_convert_gnu_property_size (ibfd, obfd); + return true; + } /* Do nothing if input file will be decompressed. */ if ((ibfd->flags & BFD_DECOMPRESS)) - return size; + return true; /* Do nothing if the input section isn't a SHF_COMPRESSED section. */ hdr_size = bfd_get_compression_header_size (ibfd, isec); if (hdr_size == 0) - return size; + return true; /* Adjust the size of the output SHF_COMPRESSED section. */ if (hdr_size == sizeof (Elf32_External_Chdr)) - return (size - sizeof (Elf32_External_Chdr) - + sizeof (Elf64_External_Chdr)); + *new_size += sizeof (Elf64_External_Chdr) - sizeof (Elf32_External_Chdr); else - return (size - sizeof (Elf64_External_Chdr) - + sizeof (Elf32_External_Chdr)); + *new_size += sizeof (Elf32_External_Chdr) - sizeof (Elf64_External_Chdr); + return true; } /* @@ -1246,30 +1246,16 @@ _bfd_elf_make_section_from_shdr (bfd *abfd, return false; } #endif - } - - if (action != nothing) - { - if (abfd->is_linker_input) + if (abfd->is_linker_input + && name[1] == 'z') { - if (name[1] == 'z' - && (action == decompress - || (action == compress - && (abfd->flags & BFD_COMPRESS_GABI) != 0))) - { - /* Convert section name from .zdebug_* to .debug_* so - that linker will consider this section as a debug - section. */ - char *new_name = bfd_zdebug_name_to_debug (abfd, name); - if (new_name == NULL) - return false; - bfd_rename_section (newsect, new_name); - } + /* Rename section from .zdebug_* to .debug_* so that ld + scripts will see this section as a debug section. */ + char *new_name = bfd_zdebug_name_to_debug (abfd, name); + if (new_name == NULL) + return false; + bfd_rename_section (newsect, new_name); } - else - /* For objdump, don't rename the section. For objcopy, delay - section rename to elf_fake_sections. */ - newsect->flags |= SEC_ELF_RENAME; } } @@ -3181,57 +3167,20 @@ elf_fake_sections (bfd *abfd, asection *asect, void *fsarg) this_hdr = &esd->this_hdr; - if (arg->link_info) - { - /* ld: compress DWARF debug sections with names: .debug_*. */ - if ((arg->link_info->compress_debug & COMPRESS_DEBUG) - && (asect->flags & SEC_DEBUGGING) - && name[1] == 'd' - && name[6] == '_') - { - /* Set SEC_ELF_COMPRESS to indicate this section should be - compressed. */ - asect->flags |= SEC_ELF_COMPRESS; - /* If this section will be compressed, delay adding section - name to section name section after it is compressed in - _bfd_elf_assign_file_positions_for_non_load. */ - delay_st_name_p = true; - } - } - else if ((asect->flags & SEC_ELF_RENAME)) - { - /* objcopy: rename output DWARF debug section. */ - if ((abfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI))) - { - /* When we decompress or compress with SHF_COMPRESSED, - convert section name from .zdebug_* to .debug_* if - needed. */ - if (name[1] == 'z') - { - char *new_name = bfd_zdebug_name_to_debug (abfd, name); - if (new_name == NULL) - { - arg->failed = true; - return; - } - name = new_name; - } - } - else if (asect->compress_status == COMPRESS_SECTION_DONE - && name[1] == 'd') - { - /* PR binutils/18087: Compression does not always make a - section smaller. So only rename the section when - compression has actually taken place. If input section - name is .zdebug_*, we should never compress it again. */ - char *new_name = bfd_debug_name_to_zdebug (abfd, name); - if (new_name == NULL) - { - arg->failed = true; - return; - } - name = new_name; - } + /* ld: compress DWARF debug sections with names: .debug_*. */ + if (arg->link_info + && (arg->link_info->compress_debug & COMPRESS_DEBUG) != 0 + && (asect->flags & SEC_DEBUGGING) + && name[1] == 'd' + && name[6] == '_') + { + /* Set SEC_ELF_COMPRESS to indicate this section should be + compressed. */ + asect->flags |= SEC_ELF_COMPRESS; + /* If this section will be compressed, delay adding section + name to section name section after it is compressed in + _bfd_elf_assign_file_positions_for_non_load. */ + delay_st_name_p = true; } if (delay_st_name_p) diff --git a/bfd/section.c b/bfd/section.c index f73e034..30ab6a7 100644 --- a/bfd/section.c +++ b/bfd/section.c @@ -347,10 +347,6 @@ CODE_FRAGMENT . TMS320C54X only. *} .#define SEC_TIC54X_BLOCK 0x10000000 . -. {* This section should be renamed. This is for ELF linker -. internal use only. *} -.#define SEC_ELF_RENAME 0x10000000 -. . {* Conditionally link this section; do not link if there are no . references found to any symbol in the section. This is for TI . TMS320C54X only. *} diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 6814e20..19dbb50 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -4118,6 +4118,13 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) flags &= ~clr; } + if (!bfd_convert_section_setup (ibfd, isection, obfd, &name, &size)) + { + osection = NULL; + err = _("failed to create output section"); + goto loser; + } + osection = bfd_make_section_anyway_with_flags (obfd, name, flags); if (osection == NULL) @@ -4126,8 +4133,6 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) goto loser; } - size = bfd_section_size (isection); - size = bfd_convert_section_size (ibfd, isection, obfd, size); if (copy_byte >= 0) size = (size + interleave - 1) / interleave * copy_width; else if (extract_symbol) |