return Symtab<ELFT>::X->addSynthetic(Name, Sec, Val);
}
+template <class ELFT>
+static void addSynthetic(StringRef Name, OutputSectionBase<ELFT> *Sec,
+ typename ELFT::uint Val) {
+ SymbolBody *S = Symtab<ELFT>::X->find(Name);
+ if (!S || S->isUndefined() || S->isShared())
+ Symtab<ELFT>::X->addSynthetic(Name, Sec, Val);
+}
// The beginning and the ending of .rel[a].plt section are marked
// with __rel[a]_iplt_{start,end} symbols if it is a statically linked
// executable. The runtime needs these symbols in order to resolve
auto Define = [&](StringRef Start, StringRef End,
OutputSectionBase<ELFT> *OS) {
if (OS) {
- Symtab<ELFT>::X->addSynthetic(Start, OS, 0);
- Symtab<ELFT>::X->addSynthetic(End, OS,
- DefinedSynthetic<ELFT>::SectionEnd);
+ addSynthetic(Start, OS, 0);
+ addSynthetic(End, OS, DefinedSynthetic<ELFT>::SectionEnd);
} else {
addOptionalSynthetic(Start, (OutputSectionBase<ELFT> *)nullptr, 0);
addOptionalSynthetic(End, (OutputSectionBase<ELFT> *)nullptr, 0);
--- /dev/null
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: echo "SECTIONS { \
+# RUN: .init_array : { \
+# RUN: __init_array_start = .; \
+# RUN: *(.init_array) \
+# RUN: __init_array_end = .; } }" > %t.script
+# RUN: ld.lld %t.o -script %t.script -o %t 2>&1
+
+.globl _start
+.text
+_start:
+ nop
+
+.section .init_array, "aw"
+ .quad 0