[lld][ELF] Suppress --orphan-handling=error/warn without SECTIONS (#93630)

Without a linker script, `--orphan-handling=error` or `=warn` reports
all input sections, including even well-known sections like `.text`,
`.bss`, `.dynamic`, or `.symtab`. However, in this case, no sections
should be considered orphans because they all are placed with the same
default rules. This patch suppresses errors/warnings for placing orphan
sections if no linker script with the `SECTIONS` command is provided.

The proposed behavior matches GNU gold. GNU ld in the same scenario only
reports sections that are not in its default linker script, thus, it
avoids complaining about `.text` and similar.
This commit is contained in:
Igor Kudrin 2024-05-29 14:53:29 -07:00 committed by GitHub
parent 058d429593
commit 34b14cc4f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 9 additions and 1 deletions

View File

@ -936,7 +936,8 @@ void LinkerScript::addOrphanSections() {
void LinkerScript::diagnoseOrphanHandling() const {
llvm::TimeTraceScope timeScope("Diagnose orphan sections");
if (config->orphanHandling == OrphanHandlingPolicy::Place)
if (config->orphanHandling == OrphanHandlingPolicy::Place ||
!hasSectionsCommand)
return;
for (const InputSectionBase *sec : orphanSections) {
// .relro_padding is inserted before DATA_SEGMENT_RELRO_END, if present,

View File

@ -11,6 +11,13 @@
# RUN: ld.lld -shared --orphan-handling=place -o %t.out --script %t.script \
# RUN: %t.o 2>&1 -verbose -error-limit=0 | FileCheck %s --check-prefix=DEFAULT
## Check --orphan-handling=error or =warn do not report errors if no linker
## script is used.
# RUN: ld.lld -shared -orphan-handling=error -o /dev/null %t.o 2>&1 | count 0
# RUN: ld.lld -shared -orphan-handling=warn -o /dev/null %t.o 2>&1 | count 0
# RUN: ld.lld -r -orphan-handling=error -o /dev/null %t.o 2>&1 | count 0
# RUN: ld.lld -r -orphan-handling=warn -o /dev/null %t.o 2>&1 | count 0
## Check --orphan-handling=error reports errors about orphans.
# RUN: not ld.lld --orphan-handling=error -o /dev/null -T %t.script \
# RUN: %t.o 2>&1 | FileCheck %s --check-prefixes=COMMON,SYMTAB