368286 |
02-Dec-2020 |
dim |
MFC r367809:
When elftoolchain's objcopy (or strip) is rewriting a file in-place, make it create the temporary file in the same directory as the source file by default, instead of always using $TMPDIR or /tmp. If creating that file fails because the directory is not writable, also fallback to $TMPDIR or /tmp.
This has also been submitted upstream as: https://sourceforge.net/p/elftoolchain/tickets/597/
Reported by: cem PR: 250872 |
367466 |
07-Nov-2020 |
dim |
Sync up elftoolchain with head, except for the capsicum-related commits, which are incompatible with stable/11.
MFC r308465 (by emaste):
c++filt: flush output after newline
Some tools spawn c++filt and pass it a single line at a time for demangling. This is akin to r276689 for addr2line.
Sponsored by: The FreeBSD Foundation
MFC r317626 (by emaste):
revert r308465: c++filt: flush output after newline
The ELF Tool Chain update to r3520 uses setvbuf to set line buffering.
Sponsored by: The FreeBSD Foundation
MFC r340746 (by oshogbo):
strings: fix style nits
Reviewed by: cem, emaste, Joseph Koshy <jkoshy@users.sourceforge.net> Differential Revision: https://reviews.freebsd.org/D18036
MFC r340750 (by mjg):
strings: unbreak the build after r340746
Discussed with: oshogbo Sponsored by: The FreeBSD Foundation
MFC r342918 (by emaste):
Update to ELF Tool Chain r3668
Highlights: - Make sure that only TLS sections are sorted into TLS segment. - Fixed multiple errors in "Section to Segment mapping". - Man page updates - ar improvements - elfcopy: avoid filter_reloc uninitialized variable for rela - elfcopy: avoid stripping relocations from static binaries - readelf: avoid printing directory in front of absolute path - readelf: add NT_FREEBSD_FEATURE_CTL FreeBSD note type - test improvements
NOTES:
Some of these changes originated in FreeBSD and simply reduce diffs between contrib and vendor.
ELF Tool Chain ar is not (currently) used in FreeBSD, and there are improvements in both FreeBSD and ELF Tool Chain ar that are not in the other.
Sponsored by: The FreeBSD Foundation
MFC r343592 (by emaste):
readelf: decode flag bits in DT_FLAGS/DT_FLAGS_1
Decode d_val when the tag is DT_FLAGS or DT_FLAGS_1 based on the information at:
https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-42444.html
PR: 232983 Submitted by: Bora Ozarslan borako.ozarslan@gmail.com Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D18784
MFC r343593 (by emaste):
readelf: fix i386 build
Use %jx and (uintmax_t) cast.
PR: 232983 Sponsored by: The FreeBSD Foundation
MFC r343614 (by emaste):
readelf: dump elf note data
Output format is compatible with GNU readelf's handling of unknown note types (modulo a GNU char signedness bug); future changes will add type- specific decoding.
Reviewed by: kib Relnotes: Yes Sponsored by: The FreeBSD Foundation
MFC r343665 (by emaste):
readelf: use table-based DT_FLAGS and DT_FLAGS_1 decoding
Fewer lines of code and more maintainable.
Reviewed by: brooks, kib Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D19053
MFC r343669 (by emaste):
readelf: decode FreeBSD note types
Decode NT_FREEBSD_ABI_TAG, NT_FREEBSD_ARCH_TAG, and NT_FREEBSD_FEATURE_CTL.
Reviewed by: brooks, kib (earlier) Relnotes: Yes Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D19054
MFC r345360 (by oshogbo):
strings: do not depend on stdin
Instead of depending on one stdin FILE structure and use freopen(3), pass to the functions appropriate FILE structure.
Reviewed by: cem Discussed with: emaste Differential Revision: https://reviews.freebsd.org/D18037
MFC r345361 (by oshogbo):
strings: do not continue if getc or getcharacter returns EOF
Reported by: cem
MFC r345362 (by oshogbo):
Fix powerpc and arm builds after r345361.
Reported by: jenkins
MFC r345364 (by oshogbo):
In case of ENCODING_8BIT the EOF code will be pass to putchar. EOF check should be done before (uint8_t)c > 127 test.
Reported by: cem
MFC r345431 (by oshogbo):
strings: return an error code and the char value separately
If we returning 32 bits value it's hard to distinguish if the returned value is a valid one or if its an error (in case of EOF). For that reason separate exit code of the function from the returned character.
Reported by: cem, se
MFC r345593 (by markj):
Prepend DW_AT_comp_dir to relative line number directory table entries.
Relative directories may appear in the line number program for a CPU if files were included via a relative path, for instance with "-I.". Previously, dwarf_srclines(3) and dwarf_srcfiles(3) would return the relative path, so addr2line, for instance, would do the same. However, we can get an absolute path by prepending the compilation directory, so change libdwarf to do that to improve compatibility with GNU binutils and since it is more useful in general.
Reviewed by: jhb Discussed with: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D19705
MFC r345646 (by emaste):
readelf: add newline after dumping dynamic FLAGS / FLAGS_1
All three dump_flags() callers need a newline after printing the flags.
Sponsored by: The FreeBSD Foundation
MFC r346323 (by emaste):
readelf: speed up readelf -wo
Use an array instead of STAILQ, and sort at the end instead of while adding new elements.
PR: 212539 Submitted by: Bora ?zarslan <borako.ozarslan@gmail.com> Reviewed by: markj Sponsored by: The FreeBSD Foundation
MFC r346327 (by emaste):
readelf: use size_t for object counts
PR: 212539 Reported by: cem Sponsored by: The FreeBSD Foundation
MFC r348347 (by jhibbits):
Add missing powerpc64 relocation support to libdwarf
Summary: Due to missing relocation support in libdwarf for powerpc64, handling of dwarf info on unlinked objects was bogus.
Examining raw dwarf data on objects compiled on ppc64 with a modern compiler (in-tree gcc tends to hide the issue, since it only rarely generates relocations in .debug_info and uses DW_FORM_str instead of DW_FORM_strp for everything), you will find that the dwarf data appears corrupt, with repeated references to the compiler version where things like types and function names should appear.
This happens because the 0 offset of .debug_str contains the compiler version, and without applying the relocations, *all* indirect strings in .dwarf_info will end up pointing to it.
This corruption then propogates to the CTF data, as ctfconvert relies on libdwarf to read the dwarf info, for every compiled object (when building a kernel.)
However, if you examine the dwarf data on a compiled executable, it will appear correct, because during final link the relocations get applied and baked in by the linker.
Submitted by: Brandon Bergren Reviewed By: emaste Differential Revision: https://reviews.freebsd.org/D20367
MFC r348430 (by markj):
elfcopy: Remove an unneeded memset.
Reviewed by: emaste, trasz Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20445
MFC r348431 (by markj):
elfcopy: Optimize for insertions at the end of the section list.
This is the common case when strip(1) is creating the output file. The change provides a significant speedup when running on ELF files with many sections.
PR: 234949 Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20444
MFC r348443 (by markj):
readelf: Make -t imply -S, for compatibility with GNU binutils.
Reported by: jhb Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20475
MFC r348444 (by markj):
libelftc: Add MLINKS.
Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20474
MFC r348652 (by markj):
libelf: Use a red-black tree to manage the section list.
The tree is indexed by section number. This speeds up elf_getscn() and its callers, which previously had to traverse a linked list. In particular, since .shstrtab is often the last section in a file, elf_strptr() would have to traverse the entire list.
PR: 234949 Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20443
MFC r348654 (by markj):
elfcopy: Use elf_getscn() instead of iterating over all sections.
When removing a section, we would loop over all sections looking for a corresponding relocation section. With r348652 it is much faster to just use elf_getscn().
PR: 234949 Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20471
MFC r348655 (by markj):
libelftc: Fix some minor style bugs.
Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20472
MFC r348657 (by markj):
elfcopy: Use libelftc's string table routines to build .shstrtab.
This replaces some hand-rolled routines and is substantially faster since libelftc uses a hash table for lookups and insertions, whereas elfcopy would perform a linear scan of the table.
PR: 234949 Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20473
MFC r348776 (by csjp):
Teach readelf about some OpenBSD ELF program headers
- Add constants for OpenBSD wxneeded, bootdata and randomize to the FreeBSD elf_common.h file. This is the file that gets used by the elftoolchain library. - Update readelf and elfdump utilities to decode these program headers if they are encountered.
Note: FreeBSD has it's own version of elfdump(1), which will be updated in a subsequent commit. I am adding it here anyway because this diff is going to be submitted upstream.
Discussed with: emaste Reviewed by: imp Differential Revision: https://reviews.freebsd.org/D20548
MFC r349420 (by markj):
libelftc: Micro-optimize string table insertion.
The string's length is already known, so use memcpy() instead of strcpy() to add it to the string table image.
Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20760
MFC r349421 (by markj):
libelftc: Consistently use size_t for string table offsets and sizes.
Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20702
MFC r349422 (by markj):
libelftc: Fix the documented prototype for elftc_string_table_destroy().
Sponsored by: The FreeBSD Foundation
MFC r349423 (by markj):
elfcopy: Provide a size hint when creating the section string table.
Use the input file's .shstrtab size as the hint if it exists. This gives a small performance improvement when processing files with many sections.
Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20544
MFC r349424 (by markj):
libdwarf: Use the cached strtab pointer when reading string attributes.
Previously we would perform a linear search of the DWARF section list for ".debug_str". However, libdwarf always caches a pointer to the strtab image in its debug descriptor. Using it gives a modest performance improvement when iterating over the attributes of each DIE.
Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20759
MFC r349481 (by mhorne):
Add some missing RISC-V ELF defines
This adds defines for the RISC-V specific e_flags values, and some of the missing static relocations.
Reviewed by: markj Approved by: markj (mentor) Differential Revision: https://reviews.freebsd.org/D20766
MFC r349482 (by mhorne):
readelf: Add support for RISC-V specific e_flags
Reviewed by: markj Approved by: markj (mentor) Differential Revision: https://reviews.freebsd.org/D20767
MFC r349483 (by mhorne):
libelftc: add RISC-V bfd targets
This adds the following targets: elf32-riscv, elf64-riscv, elf64-riscv-freebsd
Reviewed by: emaste, markj, jkoshy@users.sourceforge.net Approved by: markj (mentor) Differential Revision: https://reviews.freebsd.org/D20768
MFC r349510 (by luporl):
[PowerPC64] readelf: print description for 'e_flags' in ELF header (ABI type)
This prints out description text with the meaning of 'Flags' value in PowerPC64.
Example:
$ readelf -h ~/tmp/t1-Flag2 ELF Header:
Magic: 7f 45 4c 46 02 02 01 09 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, big endian Version: 1 (current) OS/ABI: FreeBSD ABI Version: 0 Type: EXEC (Executable file) Machine: PowerPC 64-bit Version: 0x1 Entry point address: 0x10010000 Start of program headers: 64 (bytes into file) Start of section headers: 209368 (bytes into file) Flags: 0x2, OpenPOWER ELF V2 ABI Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 10 Size of section headers: 64 (bytes) Number of section headers: 34 Section header string table index: 31
Submitted by: alfredo.junior_eldorado.org.br Reviewed by: luporl Differential Revision: https://reviews.freebsd.org/D20782
MFC r349562 (by mhorne):
elftoolchain: fix an incorrect e_flags description
r349482 introduced the definitions and descriptions of the RISC-V specific e_flags values to elftoolchain. However, the description for the EF_RISCV_RVE flag was incorrectly duplicated from EF_RISCV_RVC. Fix this by providing the proper description for this flag.
Reported by: jhb Approved by: markj (mentor)
MFC r349563 (by mhorne):
readelf: Add RISC-V DWARF register aliases
This allows DWARF debugging output to use the common register mneumonics, such as ra, sp, or t0.
DWARF registers 0-31 are mapped to the 32 general purpose registers, which are then followed by the 32 floating point registers.
Reviewed by: markj Approved by: markj (mentor) Differential Revision: https://reviews.freebsd.org/D20779
MFC r349577 (by arichardson):
Allow bootstrapping elftoolchain on MacOS and Linux
This is required in order to build on non-FreeBSD systems without setting all the XAR/XSTRINGS/etc. variables
Reviewed By: emaste Differential Revision: https://reviews.freebsd.org/D16771
MFC r349730 (by markj):
elfcopy: Clear errors after fetching the shstrtab index.
Otherwise a future call to elf_errno() will return a non-zero value. update_shdr(), for example, treats any errors associated with the ELF descriptor as fatal. Clear the error per the first example in elf_errmsg.3.
Convert to elf_getshdrstrndx() while here since elf_getshstrndx() is apparently deprecated.
Reported by: royger Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20852
MFC r350432 (by markj):
Merge r3778 and r3779 from ELFToolchain.
Modify strip(1) to not accept multiple input files when an output file is specified. There is no good way to handle this combination, and the change is compatible with binutils.
Sponsored by: The FreeBSD Foundation
MFC r350511 (by emaste):
readelf: decode NT_GNU_PROPERTY_TYPE_0 / GNU_PROPERTY_X86_FEATURE_1_AND
These bits are used for Intel CET IBT/Shadow Stack.
Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D20516
MFC r350679 (by markj):
Merge r3780 from elftoolchain.
Adjust argc and argv by optind before using them. This slightly simplifies the code. No functional change intended.
Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D21079
MFC r352875 (by ray):
ections into expected offset in binary format. Calculate binary file offset using address field, bacause software know only offset to known data, not where to load segment. With that patch, kernel .data section can have any alignment/offset - kernel boor fine.
PR: 235391 Reviewed by: markj Differential Revision: D21827
MFC r352878 (by ray):
Initialize baseaddr to suppres warning.
Pointy hat to: ray
MFC r352908 (by markj):
nm: Adjust argc and argv in get_opt().
This refactoring makes it slightly easier to capsicumize nm(1).
Discussed with: emaste Sponsored by: The FreeBSD Foundation
MFC r354544 (by emaste):
elfcopy/strip: Ensure sections have required alignment on output
Object files may specify insufficient alignment on certain sections, for example due to a bug in NASM[1]. When we detect that case in elfcopy or strip, emit a warning and increase the alignment to the minimum required.
The NASM bug was fixed in 2015[2], but we might as well have this fixup (and warning) in elfcopy in case we encounter such a file for any other reason.
This might be reworked somewhat upstream - see ELF Tool Chain ticket 485[3].
[1] https://bugzilla.nasm.us/show_bug.cgi?id=3392307 [2] https://repo.or.cz/w/nasm.git/commit/1f0cb0f2c1ba632c0fab02424928cfb756a9160c [3] https://sourceforge.net/p/elftoolchain/tickets/485/
PR: 198611 Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D2292
MFC r354842 (by jhibbits):
ELF toolchain: Add PowerPC VMX and VSX note decode to readelf
Summary: A follow-on to r276634, which added the VMX note to userland cores, and r334538 for VSX notes.
Copied from note_type_linux_core().
Reviewed by: emaste Differential Revision: https://reviews.freebsd.org/D22404
MFC r355413 (by emaste):
Update ELF Tool Chain to upstream r3769
This contains many small bugfixes and documentation improvements.
Sponsored by: The FreeBSD Foundation
MFC r357450 (by markj):
addr2line: Cache CU DIEs upon a successful address lookup.
Previously, addr2line would sequentially search all CUs for each input address. For some uses, notably syzkaller's code coverage map generator, this was extremely slow. Add a CU cache into which entries are added following a successful lookup, and search the cache before falling back to a scan. When translating a large number of addresses this yields slightly better performance than GNU addr2line.
Garbage-collect an unused hash table which appears to have been intended for the same purpose. A hash table doesn't seem particularly suitable since each CU spans a range of addresses.
Submitted by: Tiger Gao <tig@freebsdfoundation.org> Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D23418
MFC r357462 (by markj):
addr2line: Avoid a name collision.
The RB_ macros define functions with a parameter named head, and gcc warns about this.
MFC r357531 (by markj):
libdwarf: Remove unnecessary NULL checks.
All callers of _dwarf_add_expr() and _dwarf_expr_into_block() pass a non-NULL expr pointer, and these functions assume that expr is non-NULL anyway.
CID: 1193305, 1193306 Sponsored by: The FreeBSD Foundation
MFC r357532 (by markj):
libdwarf: Fix a possible memory leak in dwarf_add_AT_location_expr().
CID: 1193364 Sponsored by: The FreeBSD Foundation
MFC r357533 (by markj):
libdwarf: Make an out-pointer of _dwarf_abbrev_add() mandatory.
All callers pass a non-NULL pointer, and otherwise it was possible to leak memory if the abbrev was not added to a CU.
CID: 1193365 Sponsored by: The FreeBSD Foundation
MFC r357534 (by markj):
libdwarf: Fix a memory leak in _dwarf_frame_section_init().
If frame length validation failed we would leak memory.
CID: 1193366 Sponsored by: The FreeBSD Foundation
MFC r357535 (by markj):
libelftc: Fix memory leaks in the C++ demanglers.
CID: 1262518, 1262519, 1262520, 1262529 Sponsored by: The FreeBSD Foundation
MFC r357536 (by markj):
libelftc: Add a missing check for an error from vector_str_init().
While here consistently use the same spelling for such checks.
CID: 1376769 Sponsored by: The FreeBSD Foundation
MFC r357537 (by markj):
elfcopy: Handle multiple data descriptors properly.
The code clearly meant to resize the buffer in the case where a section was backed by multiple data descriptors.
In practice this shouldn't have been a problem since libelf would return a single data descriptor for each section in a newly opened file.
CID: 1262522 Sponsored by: The FreeBSD Foundation
MFC r357538 (by markj):
elfcopy: Avoid leaking dst's fd when we fail to copy a file.
We should really create the output file in the same directory as the destination file so that rename() works. This will be done in a future change as part of some work to run in capability mode.
CID: 1262523 Sponsored by: The FreeBSD Foundation
MFC r357539 (by markj):
size: Avoid returning a stack pointer from xlatetom().
The callers only check whether the returned pointer is non-NULL, so this was harmless in practice, but change the return value to guard against the issue.
CID: 1411597 Sponsored by: The FreeBSD Foundation
MFC r357540 (by markj):
readelf: Fix a double close of the input file.
The caller of dump_object() is responsible for opening the file, let it be responsible for closing too.
CID: 1411588 Sponsored by: The FreeBSD Foundation
MFC r357541 (by markj):
readelf: Fix the check for an error from realloc().
Use err() instead of errx() while here, since realloc() sets errno.
CID: 1401326 Sponsored by: The FreeBSD Foundation
MFC r357542 (by markj):
readelf: Don't leak memory when dwarf_get_fde_info_for_all_regs() fails.
CID: 1292493 Sponsored by: The FreeBSD Foundation
MFC r357826 (by emaste):
elfcopy: set ELF OS/ABI field when converting from binary
PR: 228934 Submitted by: Tiger Gao <tig@freebsdfoundation.org> Reviewed by: markj, jkoshy Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D23504
MFC r357844 (by emaste):
addr2line: Handle DW_AT_ranges in compile units
Based on original submission by Marat Radchenko in ELF Tool Chain ticket #545, rebased and updated by Tiger Gao.
PR: 217736 Submitted by: Marat Radchenko <marat@slonopotamus.org> Submitted by: Tiger Gao <tig@freebsdfoundation.org> Reviewed by: markj Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D23501
MFC r357862 (by emaste):
addr2line: use stdbool.h header for bool
Presumably a bool definition is obtained via header contamination on FreeBSD-CURRENT. Found while trying to upstream FreeBSD addr2line changes - the FreeBSD 11.2 CI build failed there.
Reported by: Cirrus-CI, upstream ELF Tool Chain Sponsored by: The FreeBSD Foundation
MFC r358499 (by emaste):
readelf: add PROTMAX_DISABLE and STKGAP_DISABLE
From r349609 (PROTMAX_DISABLE) and r354790 (STKGAP_DISABLE). Commited upstream (in a slightly different form) as r3831.
Sponsored by: The FreeBSD Foundation
MFC r358631 (by emaste):
Reserve WXNEEDED ELF feature control flag
This will be used to tag binaries that require W+X mappings, in advance of the ability to prevent W^X in mmap/mprotect.
There is still some discussion about the flag's name, but the ABI won't change even if the name does (as kib pointed out in the review).
Reviewed by: csjp, kib Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D23909
MFC r358637 (by emaste):
readelf: check note namesz and descsz
Previously corrupt note namesz or descsz (perhaps caused by readelf's current lack of endian support for notes) resulted in a crash. Check that namesz and descsz do not extend beyond the end of the buffer before trying to access name and desc data.
Reported by: jhb Sponsored by: The FreeBSD Foundation
MFC r358639 (by emaste):
readelf: simplify namesz / descsz checks
Sponsored by: The FreeBSD Foundation
MFC r358685 (by emaste):
libelf: rationalize error handling in ELF note conversion
Previously _libelf_cvt_NOTE_tom (to host) returned false if a note's namesz + descsz exceeded the buffer size, while _libelf_cvt_NOTE_tof (to file) silently truncated. Return false in the latter case too.
Sponsored by: The FreeBSD Foundation
MFC r358706 (by emaste):
readelf: add XEN_ELFNOTE_PHYS32_ENTRY note
See r336469 for details.
Sponsored by: The FreeBSD Foundation
MFC r358708 (by emaste):
readelf: decode and print Xen ELF note strings
Sponsored by: The FreeBSD Foundation
MFC r358713 (by emaste):
readelf: print GNU Build-ID
Sponsored by: The FreeBSD Foundation
MFC r358778 (by emaste):
readelf: hoist file opening out of dump_object
Diff reduction with HEAD to facilitate other MFCs.
MFC r359166 (by emaste):
objcopy: add new sections also when there is no .shstrtab
Previously objcopy (elfcopy) --add-sections inserted new sections before .shstrtab, but omitted them if there was no .shstrtab.
Now, after processing existing sections add new sections if they were not yet added.
PR: 241437 Reported by: arrowd Submitted by: Tiger Gao <tig@FreeBSDFoundation.org> Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D23571
MFC r359172 (by markj):
libdwarf: Make an out-pointer assignment unconditional.
There is no reason for diep to ever be NULL, since in that case we would simply be leaking memory.
CID: 1418801 Sponsored by: The FreeBSD Foundation
MFC r359173 (by markj):
libpe: Avoid a potential use-after-free in pe_update_symtab().
This function appears to be unused within FreeBSD and ELFToolChain.
CID: 1418982 Sponsored by: The FreeBSD Foundation
MFC r359174 (by markj):
readelf: Avoid leaking ELF descriptors for archive entries.
CID: 1292494 Sponsored by: The FreeBSD Foundation
MFC r359175 (by markj):
readelf: Fix another instance of the leak mentioned in r357542.
CID: 1292493 Sponsored by: The FreeBSD Foundation
MFC r359176 (by markj):
libelftc: Fix a memory leak in cpp_demangle_read_type().
CID: 1305425 Sponsored by: The FreeBSD Foundation
MFC r359189 (by emaste):
readelf: simplify Xen string note printing
Reviewed by: markj Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D24140
MFC r361104 (by jhibbits):
elftoolchain: Add powerpc64 definition to elftoolchain config
powerpc is already in place, but powerpc64 is needed separately.
MFC r361662 (by emaste):
readelf: add more DT_FLAGS_1 flags
Reference: https://docs.oracle.com/cd/E36784_01/html/E36857/chapter6-42444.html
> DF_1_SINGLETON Singleton symbols exist. > DF_1_STUB Object is a stub. > DF_1_PIE Object is a position-independent executable.
Sponsored by: The FreeBSD Foundation
MFC r365489 (by bdragon):
[PowerPC64LE] PPC64LE support for libelf.
Fix native detection when building on powerpc64le.
I will be submitting this and r361104 upstream shortly.
Sponsored by: Tag1 Consulting, Inc.
MFC r366977 (by emaste):
libelf: add compression header support
GNU and Oracle libelf implementations added support for section compression, intended to reduce the size of DWARF debug info (which might be an order of magnitude larger than the code).
There are two compressed ELF section formats:
1. Old GNU - sections are renmaed to start with 'z'. Section contains a magic number, uncompressed size, and compressed data.
2. Oracle and New GNU - compressed sections use the SHF_COMPRESSED flag. The compression header contains the compression type, uncompressed size, and uncompressed alignment.
The second style is preferred and this change implements only that one.
Submitted by: Tiger Gao <tig@FreeBSDFoundation.org> Reviewed by: markj Relnotes: Yes Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D24566
MFC r367209 (by emaste):
readelf: Add -z decompression support
Compatible with GNU readelf, -z decompresses sections displayed by -x or -p.
ELF Tool Chain ticket #555 https://sourceforge.net/p/elftoolchain/tickets/555/
Submitted by: Tiger Gao <tig@FreeBSDFoundation.org> Reviewed by: markj Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26909
MFC r367238 (by bdragon):
Fix 32-bit build after r367209
Fix build on systems with a 32-bit size_t.
Since it's being passed as a pointer, a 64-bit write to it will overflow.
MFC r367322 (by dim):
Merge elftoolchain r3877 (by jkoshy):
Incorporate fixes from Dimitry Andric:
- Use a BUFFER_GROW() macro to avoid rounding errors in capacity calculations. - Fix a bug introduced in [r3531]. - Fix handling of nested template parameters.
Ticket: #581
This should fix a number of assertions on elftoolchain's cxxfilt, and allow it to correctly demangle several names that it could not handle before.
Obtained from: https://sourceforge.net/p/elftoolchain/code/3877/ PR: 250702 |
340309 |
09-Nov-2018 |
emaste |
Fix objcopy for little-endian MIPS64 objects.
MFC r338478 (jhb): 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.
MFC r339083 (emaste): libelf: correct mips64el test to use ELF header
libelf maintains two views of endianness: e_byteorder, and e_ident[EI_DATA] in the ELF header itself. e_byteorder is not always kept in sync, so use the ELF header endianness to test for mips64el.
MFC r339473 (emaste): libelf: also test for 64-bit ELF in _libelf_is_mips64el
Although _libelf_is_mips64el is only called in contexts where we've already checked that e_class is ELFCLASS64 but this may change in the future. Add a safety belt so that we don't access an invalid e_ehdr64 union member if it does.
PR: 231790 |
339710 |
25-Oct-2018 |
emaste |
elfcopy: avoid stripping relocations from static binaries
MFC r339350: elfcopy: delete filter_reloc, it is broken and unnecessary
elfcopy contained logic to filter individual relocations in STRIP_ALL mode. However, this is not valid; relocations emitted by the linker are required, unless they apply to an entire section being removed (which is handled by other logic in elfcopy).
Note that filter_reloc was also buggy: for RELA relocation sections it operated on uninitialized rel.r_info resulting in invalid operation.
The logic most likely needs to be inverted: instead of removing relocations because their associated symbols are being removed, we must keep symbols referenced by relocations. That said, in practice we do not encounter this code path today: objects being stripped are either dynamically linked binaries which retain .dynsym, or static binaries with no relocations.
Just remove filter_reloc. This fixes certain cases including statically linked binaries containing ifuncs. Stripping binaries with relocations referencing removed symbols was already broken, and after this change may still be broken in a different way.
MFC r339451: objcopy: restore behaviour required by GCC's build
In r339350 filter_reloc() was removed, to fix the case of stripping statically linked binaries with relocations (which may come from ifunc use, for example). As a side effect this changed the behaviour when stripping object files - the output was broken both before and after r339350, in different ways. Unfortunately GCC's build process relies on the previous behaviour, so:
- Revert r339350, restoring filter_reloc(). - Fix an unitialized variable use (commited as r3638 in ELF Tool Chain). - Change filter_reloc() to omit relocations referencing removed symbols, while retaining relocations with no symbol reference. - Retain the entire relocation section if it references the dynamic symbol table (fix from kaiw in D17596).
PR: 232176 Sponsored by: The FreeBSD Foundation |
338414 |
31-Aug-2018 |
emaste |
MFC r333063: Update ELF Tool Chain to r3614
Sponsored by: The FreeBSD Foundation |
336521 |
19-Jul-2018 |
markj |
MFC r336226: Pass the right sizes to malloc() and realloc(). |
333770 |
17-May-2018 |
marius |
MFC: r333600 (phil)
Handle thread-local storage (TLS) segments correctly when copying (objcopy) and displaying (readelf) them.
PR: 227552 Submitted by: kaiw (maintainer) Approved by: re (gjb) |
327712 |
09-Jan-2018 |
emaste |
MFC r327489: elfcopy: copy raw (untranslated) contents to binary output
Previously elfcopy used elf_getdata to obtain data from ELF sections being copied to binary output, but elf_getdata returns data that has been translated - that is, data is in host byte order. When the host and target differ in endianness (e.g., converting a big-endian MIPS ELF object to binary on an x86 host) this resulted in byte-swapped data in certain sections such as .dynamic.
Instead use elf_rawdata to keep data in the original, target endianness.
Reported by: Hiroki Mori <yamori83@yahoo.co.jp>, Bill Yuan Sponsored by: The FreeBSD Foundation |
317932 |
08-May-2017 |
emaste |
MFC r317371: elfcopy: allow empty symbol list files |
317720 |
03-May-2017 |
emaste |
MFC r307808: elfcopy: select mode by the end of the program name
The mode of operation (elfcopy, mcs, or strip) is chosen based on the program name. Broaden this to allow a substring match at the end of the name to allow prefixes - for example, bsdstrip or aarch64-freebsd-strip.
This improves use of these tools as drop-in replacements for GNU objcopy and strip, which are often built with a limited set of supported targets and installed with a target prefix for cross tools. |
317623 |
01-May-2017 |
emaste |
MFC r317075: Update ELF Tool Chain to upstream r3520
Highlights of changes between r3490 and r3520:
- Improve C++ demangling - Improve compatibility with Binutils tools wrt. error messages - Handle additional types/sections/etc. in readelf and elfdump - addr2line, cxxfilt: use setvbuf to set line buffering for filter use
Also MFC r317076, version bump.
Sponsored by: The FreeBSD Foundation |
317478 |
27-Apr-2017 |
emaste |
MFC r317193: elfcopy: document --strip-symbols=filename in the man page
Reported by: bz Sponsored by: The FreeBSD Foundation |
316748 |
13-Apr-2017 |
emaste |
MFC r316284: elfcopy: remove temporary ELF file when converting from binary
Previously a command like
objcopy --input-target binary --output-target elf64-x86-64-freebsd \ binary_file object.o
would leave a temporary file behind.
ELF Tool Chain ticket #543 |
311155 |
03-Jan-2017 |
emaste |
MFC r310634: elfcopy: fix PE object section name corruption and crash
Fixed a bug that the PE object section names are generated incorrectly using the section name table found in the original input ELF object instead of the intermediate ELF object.
Ticket: #541
Do not try to copy section content from a NULL d_buf when creating uninitialized data COFF section for PE object.
Ticket: #540
Obtained from: ELF Tool Chain r3507, r3508 |
305844 |
15-Sep-2016 |
emaste |
MFC r305130: Update to ELF Tool Chain r3490
Improvements include: * readelf: report all relocation types in rel/rela for MIPS N64 * readelf: add ELFOSABI_ARM_AEABI * elfdump: add ELFOSABI_ARM_AEABI and ELFOSABI_ARM * Add recent RISC-V relocations * elfcopy: use elftc_timestamp, to support SOURCE_DATE_EPOCH
MFC r305155: readelf: silence GCC 4.2.1 uninitialized variable warning
Sponsored by: The FreeBSD Foundation |
305842 |
15-Sep-2016 |
emaste |
MFC r304191: elfcopy: correct comment typo
(Missed in r305838) |
305838 |
15-Sep-2016 |
emaste |
MFC r304151: elfcopy: silence GCC 5.3 unitialized variable warning
Although it's a false positive there is little cost to initializing it always. |
302408 |
08-Jul-2016 |
gjb |
Copy head@r302406 to stable/11 as part of the 11.0-RELEASE cycle. Prune svn:mergeinfo from the new branch, as nothing has been merged here.
Additional commits post-branch will follow.
Approved by: re (implicit) Sponsored by: The FreeBSD Foundation |
301471 |
05-Jun-2016 |
bdrewery |
Use the in-tree sys/elf_common.h to build libelftc.
This fixes build failures on older releases that lack various definitions such as EM_AARCH64 (which was unfixed before this).
Revert all of the recent compatibility changes that worked around this problem.
This uses the same method of using the in-tree header as lib/libelf, lib/libdwarf and usr.bin/readelf.
Reviewed by: emaste Sponsored by: EMC / Isilon Storage Division Differential Revision: https://reviews.freebsd.org/D6734
|
300698 |
25-May-2016 |
emaste |
Update to ELF Tool Chain r3477
This fixes a EFI/PE header issue that prevented elfcopy-produced .efi files from working with Secure Boot:
Make sure section raw size is always padded to multiple of FileAlignment from the optional header, as requested by the PE specification. This change should reduce the diff between PE image generated by Binutils objcopy and elftoolchain elfcopy.
Submitted by: kaiw Reported by: ambrisko
|
300374 |
21-May-2016 |
emaste |
elftoolchain: backwards compatability for ELFOSABI_CLOUDABI definition
It is not provided by sys/elf_common.h on older releases or -current before March 2015.
Reported by: Jenkins
|
300311 |
20-May-2016 |
emaste |
Update to ELF Tool Chain r3475
Improvements include:
* Add support for reporting and handling a number of new constants in various tools, including: * CloudABI OSABI * DT_TLSDESC_* * i386, MIPS, SPARC and amd64 relocations
* C++ demangler bug fixes
* Man page updates
* Improved input validation in several tools
This update also reduces diffs against upstream as a number of fixes included in upstream were previously cherry-picked into FreeBSD.
Sponsored by: The FreeBSD Foundation
|
298361 |
20-Apr-2016 |
emaste |
elfcopy: map all !alnum characters to '_' in binary input symbol names
This matches bfd and gold.
Obtained from: ELF Tool Chain r3445 Sponsored by: The FreeBSD Foundation
|
298085 |
15-Apr-2016 |
emaste |
elfcopy: fix symbol table handling when sections come after symtab/strtab
Fix a symbol table handling bug in elfcopy: elfcopy puts .symtab, .strtab and .shstrtab sections in the end of the output object. If the input objects have more sections after any of these 3 sections, the section table will be reordered, and in that case the section symbols should be regenerated for relocations.
The bug is triggered since newer clang puts .strtab section in the beginning of the object produced.
Ticket: #525
Reported by: royger Obtained from: ELF Tool Chain r3443
|
297242 |
24-Mar-2016 |
emaste |
elfcopy: overhaul of LMA handling
Merge ELF Tool Chain r3434:
Previously, elfcopy defines:
VMA: section virtual address LMA: PHDR(p_vaddr)
While binutils(libbfd) defines:
VMA: section virtual address and PHDR(p_vaddr). LMA: PHDR(p_paddr)
For elfcopy, p_paddr is considered not meaningful and is always set to the same value as p_vaddr.
elfcopy was implemented that way because I thought p_paddr is not used/meaningful according to the ELF ABI. However it turned out p_paddr is at least used in some ELF files, e.g. the FreeBSD kernel.
This change made elfcopy treat p_paddr as LMA, same as libbfd.
(However, some VMA/LMA related command line option still need tweaking to make them compatible with binutils objcopy. This will be improved later)
Ticket: #524
And typo fixes in r3435 and r3436.
This fixes the Xen kernel build.
Submitted by: kaiw Tested by: royger
|
296391 |
04-Mar-2016 |
emaste |
elfcopy: fail if debug link target is empty
An empty debug link target previously returned a confusing and incorrect error like "objcopy: fread failed: No error: 0". Now, return an explicit error.
GNU objcopy allows an empty file as the debug link target. However, that case is nonsensical so diverging from GNU behaviour is fine.
Reviewed by: bdrewery Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D5541
|
295661 |
16-Feb-2016 |
emaste |
Allow elfcopy to convert between two non-ELF formats
If the output object is not an ELF file, choose an arbitrary ELF format for the intermediate file. srec, ihex and binary formats are independent of class, endianness and machine type so these choices do not affect the output.
ELF Tool Chain ticket #517
Reviewed by: kai Obtained from: ELF Tool Chain r3411
|
295577 |
12-Feb-2016 |
emaste |
Update ELF Tool Chain to upstream rev 3400
Some notable improvements include:
readelf: - Add AArch64 relocation definitions. - Report value of unknown relocation types.
elfcopy: - Consider symbols with STB_GNU_UNIQUE binding as global symbols. - Fixed support for VMA adjustment for loadable sections found in relocatable objects. - Handle nameless global symbols. - Improve wildcard matching for !-prefixed symbols. - Add PE/COFF support.
elfdump: - Improve section type reporting. - Add MIPS-specific section types.
This update also includes a significant number of bug fixes.
PR: 207091 [exp-run] Sponsored by: The FreeBSD Foundation
|
292120 |
11-Dec-2015 |
emaste |
Update to ELF Tool Chain r3272
Highlights (not already in the FreeBSD tree): - addr2line: Speed up and support searching inlined functions - addr2line: Support -i, -a, -p options - readelf: Add some ARM relocation types - readelf, libelf: Avoid reading beyond end of buffer/file
Relnotes: Yes Sponsored by: The FreeBSD Foundation
|
292116 |
11-Dec-2015 |
emaste |
elfcopy: include extension but replace . when converting from binary
The change in r291958 was not consistent with GNU objcopy. The start, end and size symbols created for ELF objects converted from binary need to include the full filename including the extension, but with the periods replaced with underscores.
Reviewed by: imp Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D4474
|
291958 |
07-Dec-2015 |
emaste |
elfcopy: exclude extension when converting from binary
When converting from binary to ELF, elfcopy creates symbols _binary_<filename>_start_, _binary_<filename>_end, and _binary_<filename>_size. For compatibility with GNU objcopy (and to produce sensible symbol names) the extension must be stripped off.
Reviewed by: imp Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D4238
|
289071 |
09-Oct-2015 |
emaste |
Update to ELF Tool Chain r3250
Highlights (not already in the FreeBSD tree): - addr2line: Fixed multiple memory leaks related to DIE allocation - readelf: improve sh_link validation - various man page improvements
Sponsored by: The FreeBSD Foundation
|
284339 |
13-Jun-2015 |
emaste |
elfcopy: Handle objects without a ".shstrtab" section string table
As of LLVM revision 238073, LLVM stores symbols and section names in the same string table. From the upstream commit mesage:
With the scheme of naming sections like ".text.foo" where foo is a symbol, there is a big potential saving in using a single one.
This is a cherry-pick of ELF Tool Chain revision 3225.
Sponsored by: The FreeBSD Foundation
|
283616 |
27-May-2015 |
emaste |
Update to ELF Tool Chain r3223
Highlights (upstream revisions): - Fix SHT_GROUP handling in elfcopy/strip (3206 3220 3221) - Misc elfcopy / strip bug fixes (3215 3216 3217) - Many C++ demangler improvements (3199 3200 3201 3202 3203 3204 3205 3208 3210 3211 3212) - Improve GNU binutils compatibility in elfcopy / strip (3213 3214) - Add -g option to readelf(1): dump contents of section groups (3219) - Add EM_IAMCU 32-bit Intel MCU (3198)
Also add a compat #define for building with older FreeBSD ELF headers. The GRP_COMDAT flag was added to elf_common.h in r283110, but it's not available during the bootstrap build. It is also convenient to be able to build on older hosts.
Thanks to antoine@ for tracking down issues through multiple exp-runs and to kaiw@ for fixing.
PR: 198611 (exp-run), 200350 Sponsored by: The FreeBSD Foundation
|
282918 |
14-May-2015 |
emaste |
Update to ELF Tool Chain r3197
Highlights: - Fix man page markup, whitespace, and typos - Fix sh_info of SHT_GROUP section to point to the correct string - Improve validation in readelf and elfcopy/strip - Handle DWARF 4's DW_AT_high_pc in addr2line
Sponsored by: The FreeBSD Foundation
|
280932 |
01-Apr-2015 |
emaste |
Update elftoolchain to upstream revision 3179
Some notable changes: - libdwarf: Fixed DWARF4 line section - elfcopy: Implement --localize-hidden - nm: handle object name referenced by DW_AT_specification - elfcopy: Add --strip-dwo and --extract-dwo options for split DWARF - readelf: add remaining arm64 dynamic relocation names - nm: Avoid integer overflow in value comparison
Relnotes: Yes Sponsored by: The FreeBSD Foundation
|
278904 |
17-Feb-2015 |
emaste |
Update elftoolchain to upstream revision 3163
Most of our changes have now been committed upstream, so this change is largely bookkeeping.
Sponsored by: The FreeBSD Foundation
|
277843 |
28-Jan-2015 |
emaste |
Preserve hard & symbolic links when modifying source file
Strip is often used to modify existing files, rather than creating new files. If the existing file has hard links or is a symbolic link, act as if editing the file in place and preserve the links.
Reported by: luigi Reviewed by: imp, rpaulo Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D1682
|
277181 |
14-Jan-2015 |
emaste |
elfcopy: Avoid divide-by-0 on section alignment 0
According to ELF ABI, alignment 0 and 1 has the same meaning: the section has no alignment constraints.
PR: 196715 Sponsored by: The FreeBSD Foundation
|
276398 |
30-Dec-2014 |
emaste |
Update elftoolchain to upstream rev 3136
This fixes two strip(1) issues found during ports exp-run and adds a string hash implementation which significantly speeds up certain operations on objects with large numbers of symbols.
This also improves libdwarf handling for stripped objects with .eh_frame or .debug_frame (but not other debug) sections.
PR: 196107 Sponsored by: The FreeBSD Foundation
|
276371 |
29-Dec-2014 |
emaste |
Update elftoolchain to upstream rev 3130
This includes a number of libdwarf improvements (particularly DWARF4 related) and updates to elftoolchain tools such as strip(1). It also includes a large number of miscellaneous fixes (memory leaks, sign and cast warnings, integer overflow and underflow, etc.).
This is a merge of r276167,276170-276172 from the projects/elftoolchain-update-r3130 branch.
Sponsored by: The FreeBSD Foundation
|
276061 |
22-Dec-2014 |
emaste |
Set up default shstrtab entries at shstrtab initialization
Instead of waiting until the addition of the first non-default entry. This fixes a segfault when strip(1) is asked to remove every section from an object file.
Upstream elftoolchain ticket 463
Reviewed by: imp Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D1341
|
275916 |
18-Dec-2014 |
emaste |
Include section name in strip warning message
|
275862 |
17-Dec-2014 |
emaste |
Do not strip all when stripping an explicit symbol
When requested to strip specific symbols (-N flag) the default should be to strip nothing (other than the requested symbols). This is consistent with binutils strip(1).
PR: 196038 Reviewed by: imp Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D1327
|
275810 |
15-Dec-2014 |
emaste |
Correct elftoolchain strip(1) memory size calculation
Calculate the segment's memory size (p_memsz) using the virtual addresses, not the file offsets. Otherwise padding preceeding SHT_NOBITS sections may be excluded from the calculation, resulting in a segment that is too small.
PR: 195653 Sponsored by: The FreeBSD Foundation
|
275371 |
01-Dec-2014 |
emaste |
Track libarchive API change
|
275369 |
01-Dec-2014 |
emaste |
Fix elftoolchain tools in-tree build
* make variables static * add header for uint*_t typedefs
|
275192 |
27-Nov-2014 |
emaste |
Copy elftoolchain binutils replacements from vendor branch
Sponsored by: The FreeBSD Foundation
|
260684 |
15-Jan-2014 |
kaiw |
Initial import of elftoolchain r2974.
Obtained from: elftoolchain.org
|