forked from OSchip/llvm-project
[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
This commit is contained in:
parent
1e027b77f0
commit
1f166edeb4
|
@ -1311,7 +1311,10 @@ Expr ScriptParser::readPrimary() {
|
|||
}
|
||||
if (tok == "DEFINED") {
|
||||
StringRef name = readParenLiteral();
|
||||
return [=] { return symtab->find(name) ? 1 : 0; };
|
||||
return [=] {
|
||||
Symbol *b = symtab->find(name);
|
||||
return (b && b->isDefined()) ? 1 : 0;
|
||||
};
|
||||
}
|
||||
if (tok == "LENGTH") {
|
||||
StringRef name = readParenLiteral();
|
||||
|
|
|
@ -6,3 +6,6 @@ defined = 0
|
|||
|
||||
.section .bar,"a"
|
||||
.quad 1
|
||||
|
||||
.section .test,"a"
|
||||
.quad 1
|
||||
|
|
|
@ -3,13 +3,17 @@
|
|||
# RUN: ld.lld -o %t --script %s %t.o
|
||||
# RUN: llvm-objdump --section-headers %t | FileCheck %s
|
||||
|
||||
EXTERN(extern_defined)
|
||||
SECTIONS {
|
||||
. = DEFINED(defined) ? 0x11000 : .;
|
||||
.foo : { *(.foo*) }
|
||||
. = DEFINED(notdefined) ? 0x12000 : 0x13000;
|
||||
.bar : { *(.bar*) }
|
||||
. = DEFINED(extern_defined) ? 0x14000 : 0x15000;
|
||||
.test : { *(.test*) }
|
||||
}
|
||||
|
||||
# CHECK: 1 .foo 00000008 0000000000011000 DATA
|
||||
# CHECK: 2 .bar 00000008 0000000000013000 DATA
|
||||
# CHECK: 3 .text 00000000 0000000000013008 TEXT
|
||||
# CHECK: 3 .test 00000008 0000000000015000 DATA
|
||||
# CHECK: 4 .text 00000000 0000000000015008 TEXT
|
||||
|
|
Loading…
Reference in New Issue