freebsd-dev/contrib/elftoolchain/libelf
John Baldwin eb81f38a62 Fix objcopy for little-endian MIPS64 objects.
MIPS64 does not store the 'r_info' field of a relocation table entry as
a 64-bit value consisting of a 32-bit symbol index in the high 32 bits
and a 32-bit type in the low 32 bits as on other architectures.  Instead,
the 64-bit 'r_info' field is really a 32-bit symbol index followed by four
individual byte type fields.  For big-endian MIPS64, treating this as a
64-bit integer happens to be compatible with the layout expected by other
architectures (symbol index in upper 32-bits of resulting "native" 64-bit
integer).  However, for little-endian MIPS64 the parsed 64-bit integer
contains the symbol index in the low 32 bits and the 4 individual byte
type fields in the upper 32-bits (but as if the upper 32-bits were
byte-swapped).

To cope, add two helper routines in gelf_getrel.c to translate between the
correct native 'r_info' value and the value obtained after the normal
byte-swap translation.  Use these routines in gelf_getrel(), gelf_getrela(),
gelf_update_rel(), and gelf_update_rela().  This fixes 'readelf -r' on
little-endian MIPS64 objects which was previously decoding incorrect
relocations as well as 'objcopy: invalid symbox index' warnings from
objcopy when extracting debug symbols from kernel modules.

Even with this fixed, objcopy was still crashing when trying to extract
debug symbols from little-endian MIPS64 modules.  The workaround in
gelf_*rel*() depends on the current ELF object having a valid ELF header
so that the 'e_machine' field can be compared against EM_MIPS.  objcopy
was parsing the relocation entries to possibly rewrite the 'r_info' fields
in the update_relocs() function before writing the initial ELF header to
the destination object file.  Move the initial write of the ELF header
earlier before copy_contents() so that update_relocs() uses the correct
symbol index values.

Note that this change should really go upstream.  The binutils readelf
source has a similar hack for MIPS64EL though I implemented this version
from scratch using the MIPS64 ABI PDF as a reference.

Discussed with:	jkoshy
Reviewed by:	emaste, imp
Approved by:	re (gjb, kib)
MFC after:	1 month
Differential Revision:	https://reviews.freebsd.org/D15734
2018-09-05 20:51:53 +00:00
..
_libelf_ar.h Update elftoolchain to upstream rev 3130 2014-12-24 03:13:16 +00:00
_libelf_config.h Update ELF Tool Chain to r3614 2018-04-27 13:59:24 +00:00
_libelf.h Fix objcopy for little-endian MIPS64 objects. 2018-09-05 20:51:53 +00:00
elf_begin.3 Update to ELF Tool Chain r3197 2015-05-14 19:48:15 +00:00
elf_begin.c
elf_cntl.3 Update to ELF Tool Chain r3197 2015-05-14 19:48:15 +00:00
elf_cntl.c
elf_data.c Update to ELF Tool Chain r3475 2016-05-20 17:24:34 +00:00
elf_end.3
elf_end.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_errmsg.3
elf_errmsg.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_errno.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_fill.3
elf_fill.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_flag.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_flagdata.3 Update to ELF Tool Chain r3490 2016-08-31 15:05:04 +00:00
elf_getarhdr.3
elf_getarhdr.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_getarsym.3
elf_getarsym.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_getbase.3
elf_getbase.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_getdata.3 Update to ELF Tool Chain r3197 2015-05-14 19:48:15 +00:00
elf_getident.3
elf_getident.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_getphdrnum.3
elf_getphnum.3
elf_getscn.3
elf_getshdrnum.3
elf_getshdrstrndx.3
elf_getshnum.3
elf_getshstrndx.3
elf_hash.3
elf_hash.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_kind.3
elf_kind.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_memory.3
elf_memory.c Update elftoolchain to upstream rev 3130 2014-12-24 03:13:16 +00:00
elf_next.3
elf_next.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_open.3 Update to ELF Tool Chain r3197 2015-05-14 19:48:15 +00:00
elf_open.c Update elftoolchain to upstream rev 3130 2014-12-24 03:13:16 +00:00
elf_phnum.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_rand.3
elf_rand.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_rawfile.3
elf_rawfile.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_scn.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_shnum.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_shstrndx.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf_strptr.3
elf_strptr.c Update elftoolchain to upstream rev 3130 2014-12-24 03:13:16 +00:00
elf_types.m4
elf_update.3
elf_update.c libelf: reload section headers after update with ELF_C_WRITE 2018-08-01 15:55:14 +00:00
elf_version.3
elf_version.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
elf.3 Update to ELF Tool Chain r3197 2015-05-14 19:48:15 +00:00
elf.c
gelf_cap.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_checksum.3
gelf_checksum.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_dyn.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_ehdr.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_fsize.3
gelf_fsize.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_getcap.3
gelf_getclass.3
gelf_getclass.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_getdyn.3
gelf_getehdr.3
gelf_getmove.3
gelf_getphdr.3
gelf_getrel.3
gelf_getrela.3
gelf_getshdr.3
gelf_getsym.3
gelf_getsyminfo.3
gelf_getsymshndx.3
gelf_mips64el.c Fix objcopy for little-endian MIPS64 objects. 2018-09-05 20:51:53 +00:00
gelf_move.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_newehdr.3 Update ELF Tool Chain to upstream r3520 2017-04-17 23:56:48 +00:00
gelf_newphdr.3 Update ELF Tool Chain to upstream r3520 2017-04-17 23:56:48 +00:00
gelf_phdr.c Update ELF Tool Chain to r3614 2018-04-27 13:59:24 +00:00
gelf_rel.c Fix objcopy for little-endian MIPS64 objects. 2018-09-05 20:51:53 +00:00
gelf_rela.c Fix objcopy for little-endian MIPS64 objects. 2018-09-05 20:51:53 +00:00
gelf_shdr.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_sym.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_syminfo.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_symshndx.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_update_ehdr.3
gelf_xlate.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
gelf_xlatetof.3
gelf.3 Update to ELF Tool Chain r3197 2015-05-14 19:48:15 +00:00
gelf.h Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf_align.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf_allocate.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf_ar_util.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf_ar.c Update to ELF Tool Chain r3475 2016-05-20 17:24:34 +00:00
libelf_checksum.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf_convert.m4 Update to ELF Tool Chain r3475 2016-05-20 17:24:34 +00:00
libelf_data.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf_ehdr.c Update ELF Tool Chain to r3614 2018-04-27 13:59:24 +00:00
libelf_extended.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf_fsize.m4
libelf_memory.c Update elftoolchain to upstream rev 3130 2014-12-24 03:13:16 +00:00
libelf_msize.m4 Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf_open.c Update elftoolchain to upstream rev 3130 2014-12-24 03:13:16 +00:00
libelf_phdr.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf_shdr.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf_xlate.c Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
libelf.h Update elftoolchain to upstream revision 3179 2015-04-01 01:08:01 +00:00
Makefile Fix objcopy for little-endian MIPS64 objects. 2018-09-05 20:51:53 +00:00
os.FreeBSD.mk
os.NetBSD.mk
Version.map