一如既往,主要在工具链领域耕耘。
SHT_RISCV_ATTRIBUTES
)DT_RELR
patch to FreeBSD rtld-elf)DT_RELR
patch to glibc (highlighted feature for the 2.36 release)DT_RELR
patch to musl (milestone: 1.2.4)DT_RELR
patch to DynamoRIOzstd compressed debug sections
陈枝懋 added initial RISC-V support for non-PIC in 2018. I added PIC and TLS support in 2019. The port was mature but linker relaxation was the last main piece to bring feature parity with GNU ld. This year I
SHT_RISCV_ATTRIBUTES
merge support which has a niche valueDT_RISCV_VARIANT_CC
RISC-V linker relaxation in lld
I spent some weekends improving the performance of lld/ELF this year. Let's compare an lld 13 built with latest Clang (/tmp/out/custom0/bin/lld
) with latest lld built with latest Clang (/tmp/out/custom2/bin/lld
).
Link a -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=on
build of clang 16: 1
2
3
4
5
6lld 13: Time (mean ± σ): 687.1 ms ± 7.1 ms [User: 642.6 ms, System: 431.7 ms]
latest lld: Time (mean ± σ): 422.9 ms ± 5.3 ms [User: 579.8 ms, System: 470.7 ms]
Summary
'numactl -C 32-39 /tmp/out/custom2/bin/lld -flavor gnu @response.txt --threads=8' ran
1.62 ± 0.03 times faster than 'numactl -C 32-39 /tmp/out/custom0/bin/lld -flavor gnu @response.txt --threads=8'
Link a -DCMAKE_BUILD_TYPE=Debug
build of clang 16: 1
2
3
4
5
6lld 13: Time (mean ± σ): 4.494 s ± 0.039 s [User: 7.516 s, System: 2.909 s]
latest lld: Time (mean ± σ): 3.174 s ± 0.037 s [User: 7.361 s, System: 3.202 s]
Summary
'numactl -C 32-39 /tmp/out/custom2/bin/lld -flavor gnu @response.txt --threads=8' ran
1.42 ± 0.02 times faster than 'numactl -C 32-39 /tmp/out/custom0/bin/lld -flavor gnu @response.txt --threads=8'
--start-lib
relocatable files (avoid memory accesses to archive symbol tables)--compress-debug-sections=zlib
See lld 14 ELF changes and lld 15 ELF changes for detail. As usual, I wrote release notes for the two releases.
glibc is probably the most prominent OSS which cannot be built with Clang yet. I sent some patches last year and made a few this year. See my notes from the last year: When can glibc be built with Clang?
This year Adhemerval Zanella from Linaro maintained a local branch to fix aarch64/i386/x86_64 builds. I reviewed some of his patches.
It seems that such work will benefit some research projects. For example, Intel FineIBT used a GRTE branch of glibc.
--gcc-install-dir=
: use clang++ --gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/12
to use the selected GCC installation directory-fsanitize-address-use-odr-indicator
GlobalValue
in non-prevailing COMDAT, exposed in (Thin)LTO+PGOReviewed many commits. A lot of people don't add a Reviewed By:
tag. Anyway, counting commits with the tag can give an underestimate. 1
2% git shortlog -sn bfc8f76e60a8efd920dbd6efc4467ffb6de15919.. --grep 'Reviewed .*MaskRay' | awk '{s+=$1}END{print s}'
386
Reported many bugs and feature requests:
ar: Add --thin to avoid 'T' conflict with X/Open System Interface
ld: Make --compress-debug-sections=zlib parallel
ld: Customize output section type
ar: add 'L' modifier as a shortcut for ADDLIB
gold: --no-define-common is incompatible with GNU ld
ld: `not found for insert` error has a weird ordering
objcopy --weaken-symbol does not weaken STB_GNU_UNIQUE symbols
gas: .set should copy st_size only if src's st_size is unset
gas: -gsomething-not-already-a-long-option does not get a diagnostic
nm: add --no-weak
ld: ENTRY(no_such_symbol) in -shared mode does not report a warning
build failures with make --shuffle -j N
binutils: support zstd for SHF_COMPRESSED debug sections
ld ppc64: unneeded R_PPC64_NONE in .rela.dyn when linking Linux vdso
gdb: support zstd for SHF_COMPRESSED debug sections
elfutils: support zstd for SHF_COMPRESSED debug sections
objdump -p considers an empty .gnu.version_r invalid
gdb: support zstd compressed .gnu_debugdata
readelf: support zstd for SHF_COMPRESSED debug sections
gold, dwp: support zstd for SHF_COMPRESSED debug sections
ld: add -w to suppress warnings
ld x86: -r should not define _TLS_MODULE_BASE_
ld riscv: undefined elf_backend_obj_attrs_handle_unknown causes segfault when merging .riscv.attributes
objdump: add --show-all-symbols
My commits:
ar: Add --thin for creating thin archives
ld: Support customized output section type
objcopy --weaken-symbol: apply to STB_GNU_UNIQUE symbols
gas: copy st_size only if unset
gas: Port "copy st_size only if unset" to aarch64 and riscv
aarch64: Disallow copy relocations on protected data
aarch64: Define elf_backend_extern_protected_data to 0 [PR 18705]
aarch64: Allow PC-relative relocations against protected STT_FUNC for -shared
arm: Define elf_backend_extern_protected_data to 0 [PR 18705]
x86: Make protected symbols local for -shared
RISC-V: Remove R_RISCV_GNU_VTINHERIT/R_RISCV_GNU_VTENTRY
binutils, gdb: support zstd compressed debug sections
libctf: Add ZSTD_LIBS to LIBS so that ac_cv_libctf_bfd_elf can be true
sim: Link ZSTD_LIBS
ld: Add --undefined-version
readelf: support zstd compressed debug sections [PR 29640]
gold, dwp: support zstd compressed input debug sections [PR 29641]
gold: add --compress-debug-sections=zstd [PR 29641]
27 commits. Some work on the dynamic loader. Notable commits:
elf: Support DT_RELR relative relocation format [BZ #27924]
elf: Replace PI_STATIC_AND_HIDDEN with opposite HIDDEN_VAR_NEEDS_DYNAMIC_RELOC
elf: Refine direct extern access diagnostics to protected symbol
elf: Remove ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA
4 commits. Fixed linux-perf when unwinding ld.lld linked objects. Consulted on a number of toolchain questions.
Wrote 25 blog posts (including this one).
Added as a collaborator of riscv-non-isa/riscv-elf-psabi-doc.
Trips: Tucson, Greater Los Angeles, Cambridge and Boston, Denver, San Diego, Bellevue and Seattle, Kalispell, Washington, Honolulu.
Mastodon: https://hachyderm.io/@meowray