diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-07-10 14:20:20 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-07-10 14:27:39 -0700 |
commit | 889884731e09b46e4c2ecb051dfde1e2f69d2b47 (patch) | |
tree | a4e2caa2763562a127f970dad138ab6769b769be /binutils/objcopy.c | |
parent | a0e28e54675fd92e73df71fed5d4f6c718f40102 (diff) | |
download | gdb-889884731e09b46e4c2ecb051dfde1e2f69d2b47.zip gdb-889884731e09b46e4c2ecb051dfde1e2f69d2b47.tar.gz gdb-889884731e09b46e4c2ecb051dfde1e2f69d2b47.tar.bz2 |
Properly convert objects between different ELF classes
The output SHF_COMPRESSED section size is different from input if
ELF classes of input and output aren't the same. We must adjust
the section sizes as well as the compression headers in
SHF_COMPRESSED sections when converting objects between different
ELF classes.
bfd/
PR binutils/18656
* bfd.c (bfd_convert_section_size): New function.
(bfd_convert_section_contents): Likewise.
* bfd-in2.h: Regenerated.
binutils/
2015-07-10 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/18656
* objcopy.c (setup_section): Call bfd_convert_section_size
to get the output section size.
(copy_section): Get the section size from the output section
and call bfd_get_full_section_contents to convert section
contents for output.
binutils/testsuite/
PR binutils/18656
* binutils-all/compress.exp (convert_test): New proc.
Run conversion tests between x86-64 and x32.
Diffstat (limited to 'binutils/objcopy.c')
-rw-r--r-- | binutils/objcopy.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 7f1bd76..d6516e0 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -2872,6 +2872,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) elf_section_type (osection) = SHT_NOBITS; size = bfd_section_size (ibfd, 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) @@ -3109,14 +3110,20 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg) return; osection = isection->output_section; - size = bfd_get_section_size (isection); + /* The output SHF_COMPRESSED section size is different from input if + ELF classes of input and output aren't the same. We must use the + output section size here, which has been updated in setup_section + via bfd_convert_section_size. */ + size = bfd_get_section_size (osection); if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS) { bfd_byte *memhunk = NULL; - if (!bfd_get_full_section_contents (ibfd, isection, &memhunk)) + if (!bfd_get_full_section_contents (ibfd, isection, &memhunk) + || !bfd_convert_section_contents (ibfd, isection, obfd, + &memhunk)) { status = 1; bfd_nonfatal_message (NULL, ibfd, isection, NULL); |