#
03051f7a |
| 30-Jun-2021 |
Fangrui Song <i@maskray.me> |
[ELF] Preserve section order within an INSERT AFTER command
For ``` SECTIONS { text.0 : {} text.1 : {} text.2 : {} } INSERT AFTER .data; ```
the current order is `.data text.2 text.1 text.0`.
[ELF] Preserve section order within an INSERT AFTER command
For ``` SECTIONS { text.0 : {} text.1 : {} text.2 : {} } INSERT AFTER .data; ```
the current order is `.data text.2 text.1 text.0`. It makes more sense to preserve the specified order and thus improve compatibility with GNU ld.
For ``` SECTIONS { text.0 : {} } INSERT AFTER .data; SECTIONS { text.3 : {} } INSERT AFTER .data; ```
GNU ld somehow collects sections with `INSERT AFTER .data` together (IMO inconsistent) but I think it makes more sense to execute the commands in order and get `.data text.3 text.0` instead.
Reviewed By: peter.smith
Differential Revision: https://reviews.llvm.org/D105158
show more ...
|
Revision tags: llvmorg-12.0.1, llvmorg-12.0.1-rc4, llvmorg-12.0.1-rc3 |
|
#
2508733e |
| 25-Jun-2021 |
Fangrui Song <i@maskray.me> |
[ELF] --sysroot: change sysrooted script to not fall back for an absolute path
Modify the D13209 logic: for a script inside the sysroot, if an absolute path does not exist, report an error instead o
[ELF] --sysroot: change sysrooted script to not fall back for an absolute path
Modify the D13209 logic: for a script inside the sysroot, if an absolute path does not exist, report an error instead of falling back to the path without the sysroot prefix.
This matches GNU ld, which makes sense to me: we don't want to find an arbitrary file in the host.
Reviewed By: ikudrin
Differential Revision: https://reviews.llvm.org/D104894
show more ...
|
#
3c6f8ca7 |
| 24-Jun-2021 |
Martin Storsjö <martin@martin.st> |
[lld] Rename StringRef _lower() method calls to _insensitive()
|
Revision tags: llvmorg-12.0.1-rc2 |
|
#
899fdf54 |
| 13-Jun-2021 |
Fangrui Song <i@maskray.me> |
[ELF] Add OVERWRITE_SECTIONS command
This implements https://sourceware.org/bugzilla/show_bug.cgi?id=26404
An `OVERWRITE_SECTIONS` command is a `SECTIONS` variant which contains several output sect
[ELF] Add OVERWRITE_SECTIONS command
This implements https://sourceware.org/bugzilla/show_bug.cgi?id=26404
An `OVERWRITE_SECTIONS` command is a `SECTIONS` variant which contains several output section descriptions. The output sections do not have specify an order. Similar to `INSERT [BEFORE|AFTER]`, `LinkerScript::hasSectionsCommand` is not set, so the built-in rules (see `docs/ELF/linker_script.rst`) still apply. `OVERWRITE_SECTIONS` can be more convenient than `INSERT` because it does not need an anchor section.
The initial syntax is intentionally narrow to facilitate backward compatible extensions in the future. Symbol assignments cannot be used.
This feature is versatile. To list a few usage:
* Use `section : { KEEP(...) }` to retain input sections under GC * Define encapsulation symbols (start/end) for an output section * Use `section : ALIGN(...) : { ... }` to overalign an output section (similar to ld64 `-sectalign`)
When an output section is specified by both `OVERWRITE_SECTIONS` and `INSERT`, `INSERT` is processed after overwrite sections. To make this work, this patch changes `InsertCommand` to use name based matching instead of pointer based matching. (This may cause a difference when `INSERT` moves one output section more than once. Such duplicate commands should not be used in practice (seems that in GNU ld the output sections may just disappear).)
A linker script can be used without -T/--script. The traditional `SECTIONS` commands are concatenated, so a wrong rule can be more noticeable from the section order. This feature if misused can be less noticeable, just like `INSERT`.
Differential Revision: https://reviews.llvm.org/D103303
show more ...
|
Revision tags: llvmorg-12.0.1-rc1, llvmorg-12.0.0, llvmorg-12.0.0-rc5, llvmorg-12.0.0-rc4 |
|
#
e4f385d8 |
| 11-Mar-2021 |
Fangrui Song <i@maskray.me> |
[ELF] Support . and $ in symbol names in expressions
GNU ld supports `.` and `$` in symbol names while LLD doesn't support them in `readPrimary` expressions. Using `.` can result in such an error:
[ELF] Support . and $ in symbol names in expressions
GNU ld supports `.` and `$` in symbol names while LLD doesn't support them in `readPrimary` expressions. Using `.` can result in such an error:
``` https://github.com/ClangBuiltLinux/linux/issues/1318 ld.lld: error: ./arch/powerpc/kernel/vmlinux.lds:255: malformed number: .TOC. >>> __toc_ptr = (DEFINED (.TOC.) ? .TOC. : ADDR (.got)) + 0x8000; ```
Allow `.` (ppc64 special symbol `.TOC.`) and `$` (RISC-V special symbol `__global_pointer$`).
Change `diag[3-5].test` to use an invalid character `^`.
Note: GNU ld allows `~` in non-leading positions of a symbol name. `~` is not used in practice, conflicts with the unary operator, and can cause some parsing difficulty, so this patch does not add it.
Differential Revision: https://reviews.llvm.org/D98306
show more ...
|
Revision tags: llvmorg-12.0.0-rc3, llvmorg-12.0.0-rc2 |
|
#
eea34aae |
| 08-Feb-2021 |
Fangrui Song <i@maskray.me> |
[ELF] Inspect -EL & -EB for OUTPUT_FORMAT(default, big, little)
Choose big if -EB is specified, little if -EL is specified, or default if neither is specified. The new behavior matches GNU ld.
Fixe
[ELF] Inspect -EL & -EB for OUTPUT_FORMAT(default, big, little)
Choose big if -EB is specified, little if -EL is specified, or default if neither is specified. The new behavior matches GNU ld.
Fixes: https://github.com/ClangBuiltLinux/linux/issues/1025
Differential Revision: https://reviews.llvm.org/D96214
show more ...
|
#
7605a9a0 |
| 08-Feb-2021 |
Fangrui Song <i@maskray.me> |
[ELF] Support aarch64_be
This patch adds
* Big-endian values for `R_AARCH64_{ABS,PREL}{16,32,64}` and `R_AARCH64_PLT32` * aarch64elfb & aarch64linuxb BFD emulations * elf64-bigaarch64 output format
[ELF] Support aarch64_be
This patch adds
* Big-endian values for `R_AARCH64_{ABS,PREL}{16,32,64}` and `R_AARCH64_PLT32` * aarch64elfb & aarch64linuxb BFD emulations * elf64-bigaarch64 output format (bfdname)
Link: https://github.com/ClangBuiltLinux/linux/issues/1288
Differential Revision: https://reviews.llvm.org/D96188
show more ...
|
Revision tags: llvmorg-11.1.0, llvmorg-11.1.0-rc3, llvmorg-12.0.0-rc1, llvmorg-13-init, llvmorg-11.1.0-rc2, llvmorg-11.1.0-rc1 |
|
#
275eb828 |
| 02-Jan-2021 |
Brandon Bergren <bdragon@FreeBSD.org> |
[PowerPC] Support powerpcle target in LLD [4/5]
Add support for linking powerpcle code in LLD.
Rewrite lld/test/ELF/emulation-ppc.s to use a shared check block and add powerpcle tests.
Update test
[PowerPC] Support powerpcle target in LLD [4/5]
Add support for linking powerpcle code in LLD.
Rewrite lld/test/ELF/emulation-ppc.s to use a shared check block and add powerpcle tests.
Update tests.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D93917
show more ...
|
Revision tags: llvmorg-11.0.1, llvmorg-11.0.1-rc2 |
|
#
92c6141c |
| 14-Dec-2020 |
LemonBoy <thatlemon@gmail.com> |
lld/ELF: Parse MSP430 BFD/emulation names
Follow the naming set by TI's own GCC-based toolchain. Also, force the `osabi` field to `ELFOSABI_STANDALONE`, this matches GNU LD's output (the patching is
lld/ELF: Parse MSP430 BFD/emulation names
Follow the naming set by TI's own GCC-based toolchain. Also, force the `osabi` field to `ELFOSABI_STANDALONE`, this matches GNU LD's output (the patching is done in `elf32_msp430_post_process_headers`).
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D92931
show more ...
|
Revision tags: llvmorg-11.0.1-rc1 |
|
#
2a9aed0e |
| 12-Nov-2020 |
Fangrui Song <i@maskray.me> |
[ELF] Support multiple SORT in an input section description
The second `SORT` in `*(SORT(...) SORT(...))` is incorrectly parsed as a file pattern. Fix the bug by stopping at `SORT*` in `readInputSec
[ELF] Support multiple SORT in an input section description
The second `SORT` in `*(SORT(...) SORT(...))` is incorrectly parsed as a file pattern. Fix the bug by stopping at `SORT*` in `readInputSectionsList`.
Reviewed By: grimar
Differential Revision: https://reviews.llvm.org/D91180
show more ...
|
#
439341b9 |
| 03-Nov-2020 |
James Henderson <james.henderson@sony.com> |
[lld][ELF] Add additional time trace categories
I noticed when running a large link with the --time-trace option that there were several areas which were missing any specific time trace categories (
[lld][ELF] Add additional time trace categories
I noticed when running a large link with the --time-trace option that there were several areas which were missing any specific time trace categories (aside from the generic link/ExecuteLinker categories). This patch adds new categories to fill most of the "gaps", or to provide more detail than was previously provided.
Reviewed by: MaskRay, grimar, russell.gallop
Differential Revision: https://reviews.llvm.org/D90686
show more ...
|
Revision tags: llvmorg-11.0.0, llvmorg-11.0.0-rc6, llvmorg-11.0.0-rc5, llvmorg-11.0.0-rc4, llvmorg-11.0.0-rc3, llvmorg-11.0.0-rc2, llvmorg-11.0.0-rc1 |
|
#
1f166ede |
| 16-Jul-2020 |
Hafiz Abid Qadeer <abidh@codesourcery.com> |
[lld][linkerscript] Fix handling of DEFINED.
Current implementation did not check that symbols is actually defined. Only checked for presence. GNU ld documentation says,
"Return 1 if symbol is in
[lld][linkerscript] Fix handling of DEFINED.
Current implementation did not check that symbols is actually defined. Only checked for presence. GNU ld documentation says,
"Return 1 if symbol is in the linker global symbol table and is defined before the statement using DEFINED in the script, otherwise return 0."
https://sourceware.org/binutils/docs/ld/Builtin-Functions.html#Builtin-Functions
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D83758
show more ...
|
#
fa1145a8 |
| 27-Jul-2020 |
Isaac Richter <isaac@irichter.net> |
[lld][ELF] Add LOG2CEIL builtin ldscript function
This patch adds support for the LOG2CEIL builtin function in linker scripts: https://sourceware.org/binutils/docs/ld/Builtin-Functions.html#index-LO
[lld][ELF] Add LOG2CEIL builtin ldscript function
This patch adds support for the LOG2CEIL builtin function in linker scripts: https://sourceware.org/binutils/docs/ld/Builtin-Functions.html#index-LOG2CEIL_0028exp_0029
As documented for LD, and to keep compatibility, LOG2CEIL(0) returns 0 (not -inf).
The test vectors are somewhat arbitrary. We check minimum values (0-4); middle values (2^32, and 2^32+1); and the maximum value (2^64-1).
The checks for LOG2CEIL explicitly use full 64-bit values (16 hex digits). This is needed to properly verify that -inf and other interesting results aren't returned. (For some reason, all other tests in operators.test use only 14 digits.)
Differential revision: https://reviews.llvm.org/D84054
show more ...
|
Revision tags: llvmorg-12-init, llvmorg-10.0.1, llvmorg-10.0.1-rc4, llvmorg-10.0.1-rc3, llvmorg-10.0.1-rc2 |
|
#
49279ca1 |
| 18-Jun-2020 |
Fangrui Song <maskray@google.com> |
[ELF] Improve --export-dynamic-symbol performance by checking whether wildcard is really used
A hasWildcard pattern iterates over symVector, which can be slow when there are many --export-dynamic-sy
[ELF] Improve --export-dynamic-symbol performance by checking whether wildcard is really used
A hasWildcard pattern iterates over symVector, which can be slow when there are many --export-dynamic-symbol. In optimistic cases, most patterns don't use a wildcard character. hasWildcard: false can avoid a symbol table iteration.
While here, add two tests using `[` and `?`, respectively.
show more ...
|
#
751f18e7 |
| 01-Jun-2020 |
Fangrui Song <maskray@google.com> |
[ELF] Refine --export-dynamic-symbol semantics to be compatible GNU ld 2.35
GNU ld from binutils 2.35 onwards will likely support --export-dynamic-symbol but with different semantics. https://source
[ELF] Refine --export-dynamic-symbol semantics to be compatible GNU ld 2.35
GNU ld from binutils 2.35 onwards will likely support --export-dynamic-symbol but with different semantics. https://sourceware.org/pipermail/binutils/2020-May/111302.html
Differences:
1. -export-dynamic-symbol is not supported 2. --export-dynamic-symbol takes a glob argument 3. --export-dynamic-symbol can suppress binding the references to the definition within the shared object if (-Bsymbolic or -Bsymbolic-functions) 4. --export-dynamic-symbol does not imply -u
I don't think the first three points can affect any user. For the fourth point, Not implying -u can lead to some archive members unfetched. Add -u foo to restore the previous behavior.
Exact semantics:
* -no-pie or -pie: matched non-local defined symbols will be added to the dynamic symbol table. * -shared: matched non-local STV_DEFAULT symbols will not be bound to definitions within the shared object even if they would otherwise be due to -Bsymbolic, -Bsymbolic-functions, or --dynamic-list.
Reviewed By: psmith
Differential Revision: https://reviews.llvm.org/D80487
show more ...
|
Revision tags: llvmorg-10.0.1-rc1 |
|
#
07837b8f |
| 15-May-2020 |
Fangrui Song <maskray@google.com> |
[ELF] Use namespace qualifiers (lld:: or elf::) instead of `namespace lld { namespace elf {`
Similar to D74882. This reverts much code from commit bd8cfe65f5fee4ad573adc2172359c9552e8cdc0 (D68323) a
[ELF] Use namespace qualifiers (lld:: or elf::) instead of `namespace lld { namespace elf {`
Similar to D74882. This reverts much code from commit bd8cfe65f5fee4ad573adc2172359c9552e8cdc0 (D68323) and fixes some problems before D68323.
Sorry for the churn but D68323 was a mistake. Namespace qualifiers avoid bugs where the definition does not match the declaration from the header. See https://llvm.org/docs/CodingStandards.html#use-namespace-qualifiers-to-implement-previously-declared-functions (D74515)
Differential Revision: https://reviews.llvm.org/D79982
show more ...
|
#
c384ca3c |
| 09-Apr-2020 |
Fangrui Song <maskray@google.com> |
[ELF] For relative paths in INPUT() and GROUP(), search the directory of the current linker script before searching other paths
For a relative path in INPUT() or GROUP(), this patch changes the sear
[ELF] For relative paths in INPUT() and GROUP(), search the directory of the current linker script before searching other paths
For a relative path in INPUT() or GROUP(), this patch changes the search order by adding the directory of the current linker script. The new search order (consistent with GNU ld >= 2.35 regarding the new test `test/ELF/input-relative.s`):
1. the directory of the current linker script (GNU ld from Binutils 2.35 onwards; https://sourceware.org/bugzilla/show_bug.cgi?id=25806) 2. the current working directory 3. library paths (-L)
This behavior makes it convenient to replace a .so or .a with a linker script with additional input. For example, glibc
``` % cat /usr/lib/x86_64-linux-gnu/libm.a /* GNU ld script */ OUTPUT_FORMAT(elf64-x86-64) GROUP ( /usr/lib/x86_64-linux-gnu/libm-2.29.a /usr/lib/x86_64-linux-gnu/libmvec.a ) ```
could be simplified as `GROUP(libm-2.29.a libmvec.a)`.
Another example is to make libc++.a a linker script: ``` INPUT(libc++.a.1 libc++abi.a) ```
Note, -l is not affected.
Reviewed By: psmith
Differential Revision: https://reviews.llvm.org/D77779
show more ...
|
#
aff950e9 |
| 17-Apr-2020 |
LemonBoy <thatlemon@gmail.com> |
[ELF] Support a few more SPARCv9 relocations
Implemented a bunch of relocations found in binaries with medium/large code model and the Local-Exec TLS model. The binaries link and run fine in Qemu. I
[ELF] Support a few more SPARCv9 relocations
Implemented a bunch of relocations found in binaries with medium/large code model and the Local-Exec TLS model. The binaries link and run fine in Qemu. In addition, the emulation `elf64_sparc` is now recognized.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D77672
show more ...
|
#
fdc41aa2 |
| 28-Mar-2020 |
Matt Schulte <schultetwin1@gmail.com> |
[lld][ELF] Mark empty NOLOAD output sections SHT_NOBITS instead of SHT_PROGBITS
This fixes PR# 45336. Output sections described in a linker script as NOLOAD with no input sections would be marked as
[lld][ELF] Mark empty NOLOAD output sections SHT_NOBITS instead of SHT_PROGBITS
This fixes PR# 45336. Output sections described in a linker script as NOLOAD with no input sections would be marked as SHT_PROGBITS.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D76981
show more ...
|
Revision tags: llvmorg-10.0.0, llvmorg-10.0.0-rc6 |
|
#
011b7855 |
| 20-Mar-2020 |
Fangrui Song <maskray@google.com> |
[ELF] Create readonly PT_LOAD in the presence of a SECTIONS command
This essentially drops the change by r288021 (discussed with Georgii Rymar and Peter Smith and noted down in the release note of l
[ELF] Create readonly PT_LOAD in the presence of a SECTIONS command
This essentially drops the change by r288021 (discussed with Georgii Rymar and Peter Smith and noted down in the release note of lld 10).
GNU ld>=2.31 enables -z separate-code by default for Linux x86. By default (in the absence of a PHDRS command) a readonly PT_LOAD is created, which is different from its traditional behavior.
Not emulating GNU ld's traditional behavior is good for us because it improves code consistency (we create a readonly PT_LOAD in the absence of a SECTIONS command).
Users can add --no-rosegment to restore the previous behavior (combined readonly and read-executable sections in a single RX PT_LOAD).
show more ...
|
Revision tags: llvmorg-10.0.0-rc5, llvmorg-10.0.0-rc4, llvmorg-10.0.0-rc3 |
|
#
bb7d2b17 |
| 16-Feb-2020 |
Georgii Rymar <grimar@accesssoftek.com> |
[LLD][ELF] - Disambiguate "=fillexp" with a primary expression to allow =0x90 /DISCARD/
Fixes https://bugs.llvm.org/show_bug.cgi?id=44903
It is about the following case:
``` SECTIONS { .foo : {
[LLD][ELF] - Disambiguate "=fillexp" with a primary expression to allow =0x90 /DISCARD/
Fixes https://bugs.llvm.org/show_bug.cgi?id=44903
It is about the following case:
``` SECTIONS { .foo : { *(.foo) } =0x90909090 /DISCARD/ : { *(.bar) } } ```
Here while parsing the fill expression we treated the "/" of "/DISCARD/" as operator.
With this change, suggested by Fangrui Song, we do not allow expressions with operators (e.g. "0x1100 + 0x22") that are not wrapped into round brackets. It should not be an issue for users, but helps to resolve parsing ambiguity.
Differential revision: https://reviews.llvm.org/D74687
show more ...
|
#
2822852f |
| 12-Mar-2020 |
Shoaib Meenai <smeenai@fb.com> |
[ELF] Correct error message when OUTPUT_FORMAT is used
Any OUTPUT_FORMAT in a linker script overrides the emulation passed on the command line, so record the passed bfdname and use that in the error
[ELF] Correct error message when OUTPUT_FORMAT is used
Any OUTPUT_FORMAT in a linker script overrides the emulation passed on the command line, so record the passed bfdname and use that in the error message about incompatible input files.
This prevents confusing error messages. For example, if you explicitly pass `-m elf_x86_64` to LLD but accidentally include a linker script which sets `OUTPUT_FORMAT(elf32-i386)`, LLD would previously complain about your input files being compatible with elf_x86_64, which isn't the actual issue, and is confusing because the input files are in fact x86-64 ELF files.
Interestingly enough, this also prevents a segfault! When we don't pass `-m` and we have an object file which is incompatible with the `OUTPUT_FORMAT` set by a linker script, the object file is checked for compatibility before it's added to the objectFiles vector. config->emulation, objectFiles, and sharedFiles will all be empty, so we'll attempt to access bitcodeFiles[0], but bitcodeFiles is also empty, so we'll segfault. This commit prevents the segfault by adding OUTPUT_FORMAT as a possible source of machine configuration, and it also adds an llvm_unreachable to diagnose similar issues in the future.
Differential Revision: https://reviews.llvm.org/D76109
show more ...
|
#
92b5b980 |
| 06-Mar-2020 |
Fangrui Song <maskray@google.com> |
[ELF] Postpone evaluation of ORIGIN/LENGTH in a MEMORY command
``` createFiles(args) readDefsym readerLinkerScript(*mb) ... readMemory readMemoryAssignment("ORIGIN", "org", "o") // eagerl
[ELF] Postpone evaluation of ORIGIN/LENGTH in a MEMORY command
``` createFiles(args) readDefsym readerLinkerScript(*mb) ... readMemory readMemoryAssignment("ORIGIN", "org", "o") // eagerly evaluated target = getTarget(); link(args) writeResult<ELFT>() ... finalizeSections() script->processSymbolAssignments() addSymbol(cmd) // with this patch, evaluated here ```
readMemoryAssignment eagerly evaluates ORIGIN/LENGTH and returns an uint64_t. This patch postpones the evaluation to make
* --defsym and symbol assignments * `CONSTANT(COMMONPAGESIZE)` (requires a non-null `lld::elf::target`)
work. If the expression somehow requires interaction with memory regions, the circular dependency may cause the expression to evaluate to a strange value. See the new test added to memory-err.s
Reviewed By: grimar
Differential Revision: https://reviews.llvm.org/D75763
show more ...
|
Revision tags: llvmorg-10.0.0-rc2 |
|
#
7c426fb1 |
| 10-Feb-2020 |
Fangrui Song <maskray@google.com> |
[ELF] Support INSERT [AFTER|BEFORE] for orphan sections
D43468+D44380 added INSERT [AFTER|BEFORE] for non-orphan sections. This patch makes INSERT work for orphan sections as well.
`SECTIONS {...}
[ELF] Support INSERT [AFTER|BEFORE] for orphan sections
D43468+D44380 added INSERT [AFTER|BEFORE] for non-orphan sections. This patch makes INSERT work for orphan sections as well.
`SECTIONS {...} INSERT [AFTER|BEFORE] .foo` does not set `hasSectionCommands`, so the result will be similar to a regular link without a linker script. The differences when `hasSectionCommands` is set include:
* image base is different * -z noseparate-code/-z noseparate-loadable-segments are unavailable * some special symbols such as `_end _etext _edata` are not defined
The behavior is similar to GNU ld: INSERT is not considered an external linker script.
This feature makes the section layout more flexible. It can be used to:
* Place .nv_fatbin before other readonly SHT_PROGBITS sections to mitigate relocation overflows. * Disturb the layout to expose address sensitive application bugs.
Reviewed By: grimar
Differential Revision: https://reviews.llvm.org/D74375
show more ...
|
#
5f380403 |
| 08-Feb-2020 |
Fangrui Song <maskray@google.com> |
[ELF] Simplify parsing of version dependency. NFC
|