aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/bfd-in2.h9
-rw-r--r--bfd/compress.c70
-rw-r--r--bfd/elf.c95
-rw-r--r--bfd/section.c4
-rw-r--r--binutils/objcopy.c9
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;
}
/*
diff --git a/bfd/elf.c b/bfd/elf.c
index a013f88..61058de 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -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)