Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -170,10 +170,10 @@ // over symbol assignment commands and create placeholder symbols if needed. void LinkerScript::declareSymbols() { assert(!Ctx); - for (BaseCommand *Base : SectionCommands) { + auto Fn = [](BaseCommand *Base) { auto *Cmd = dyn_cast(Base); if (!Cmd || !shouldDefineSym(Cmd)) - continue; + return; // We can't calculate final value right now. Symbol *Sym; @@ -186,6 +186,22 @@ STT_NOTYPE, 0, 0, nullptr); Cmd->Sym = cast(Sym); Cmd->Provide = false; + }; + + for (BaseCommand *Base : SectionCommands) { + auto *Sec = dyn_cast(Base); + if (!Sec) { + Fn(Base); + continue; + } + // If the output section directive has constraints, + // we can't say for sure whether it will be included or not. + // Skip such sections for now. Improve the checks if we ever + // need symbols from that sections to be declared early. + if (Sec->Constraint != ConstraintKind::NoConstraint) + continue; + for (BaseCommand *Base2 : Sec->SectionCommands) + Fn(Base2); } } Index: test/ELF/linkerscript/symbols-synthetic.s =================================================================== --- test/ELF/linkerscript/symbols-synthetic.s +++ test/ELF/linkerscript/symbols-synthetic.s @@ -61,7 +61,6 @@ # SIMPLE-NEXT: 0000000000000120 .foo 00000000 _begin_sec # SIMPLE-NEXT: 0000000000000128 *ABS* 00000000 _end_sec_abs # SIMPLE-NEXT: 0000000000001048 .text 00000000 _start -# SIMPLE-NEXT: 0000000000000ee4 *ABS* 00000000 size_foo_3 # SIMPLE-NEXT: 0000000000000120 .foo 00000000 begin_foo # SIMPLE-NEXT: 0000000000000128 .foo 00000000 end_foo # SIMPLE-NEXT: 0000000000000008 *ABS* 00000000 size_foo_1 @@ -69,6 +68,7 @@ # SIMPLE-NEXT: 0000000000001000 .foo 00000000 begin_bar # SIMPLE-NEXT: 0000000000001004 .foo 00000000 end_bar # SIMPLE-NEXT: 0000000000000ee4 *ABS* 00000000 size_foo_2 +# SIMPLE-NEXT: 0000000000000ee4 *ABS* 00000000 size_foo_3 # SIMPLE-NEXT: 0000000000001004 .eh_frame_hdr 00000000 __eh_frame_hdr_start # SIMPLE-NEXT: 0000000000001010 *ABS* 00000000 __eh_frame_hdr_start2 # SIMPLE-NEXT: 0000000000001018 .eh_frame_hdr 00000000 __eh_frame_hdr_end Index: test/ELF/linkerscript/version-script.s =================================================================== --- test/ELF/linkerscript/version-script.s +++ test/ELF/linkerscript/version-script.s @@ -5,6 +5,10 @@ # RUN: ld.lld -T %t.script -shared --no-undefined-version %t.o -o %t.so # RUN: llvm-readobj -V %t.so | FileCheck %s +# RUN: echo "SECTIONS { .text : { bar = foo; *(.text) } } VERSION { V { global: foo; bar; local: *; }; }" > %t.script +# RUN: ld.lld -T %t.script -shared --no-undefined-version %t.o -o %t.so +# RUN: llvm-readobj -V %t.so | FileCheck %s + ## Check that we are able to version symbols defined in script. # CHECK: Symbols [ # CHECK-NEXT: Symbol {