forked from OSchip/llvm-project
[ELF] Use entry point from LinkerOptions.
Patch by Ahmed Bougacha! llvm-svn: 173655
This commit is contained in:
parent
fa0939f790
commit
990ec2b223
|
@ -34,6 +34,7 @@ public:
|
||||||
uint16_t getOutputType() const;
|
uint16_t getOutputType() const;
|
||||||
uint16_t getOutputMachine() const;
|
uint16_t getOutputMachine() const;
|
||||||
|
|
||||||
|
virtual StringRef getEntry() const;
|
||||||
virtual uint64_t getBaseAddress() const { return _options._baseAddress; }
|
virtual uint64_t getBaseAddress() const { return _options._baseAddress; }
|
||||||
|
|
||||||
static std::unique_ptr<ELFTargetInfo> create(const LinkerOptions &lo);
|
static std::unique_ptr<ELFTargetInfo> create(const LinkerOptions &lo);
|
||||||
|
|
|
@ -124,9 +124,6 @@ public:
|
||||||
|
|
||||||
if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_entry))
|
if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_entry))
|
||||||
newArgs->AddJoinedArg(A, _core.getOption(core::OPT_entry), A->getValue());
|
newArgs->AddJoinedArg(A, _core.getOption(core::OPT_entry), A->getValue());
|
||||||
else
|
|
||||||
newArgs->AddJoinedArg(nullptr, _core.getOption(core::OPT_entry),
|
|
||||||
"_start");
|
|
||||||
|
|
||||||
if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_output))
|
if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_output))
|
||||||
newArgs->AddJoinedArg(A, _core.getOption(core::OPT_output),
|
newArgs->AddJoinedArg(A, _core.getOption(core::OPT_output),
|
||||||
|
|
|
@ -68,4 +68,11 @@ std::unique_ptr<ELFTargetInfo> ELFTargetInfo::create(const LinkerOptions &lo) {
|
||||||
return std::unique_ptr<ELFTargetInfo>();
|
return std::unique_ptr<ELFTargetInfo>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StringRef ELFTargetInfo::getEntry() const {
|
||||||
|
if (!_options._entrySymbol.empty())
|
||||||
|
return _options._entrySymbol;
|
||||||
|
return "_start";
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace lld
|
} // end namespace lld
|
||||||
|
|
|
@ -149,7 +149,7 @@ void ELFExecutableWriter<ELFT>::assignSectionsWithNoSegments() {
|
||||||
/// absolute symbols
|
/// absolute symbols
|
||||||
template<class ELFT>
|
template<class ELFT>
|
||||||
void ELFExecutableWriter<ELFT>::addDefaultAtoms() {
|
void ELFExecutableWriter<ELFT>::addDefaultAtoms() {
|
||||||
_runtimeFile.addUndefinedAtom("_start");
|
_runtimeFile.addUndefinedAtom(_targetInfo.getEntry());
|
||||||
_runtimeFile.addAbsoluteAtom("__bss_start");
|
_runtimeFile.addAbsoluteAtom("__bss_start");
|
||||||
_runtimeFile.addAbsoluteAtom("__bss_end");
|
_runtimeFile.addAbsoluteAtom("__bss_end");
|
||||||
_runtimeFile.addAbsoluteAtom("_end");
|
_runtimeFile.addAbsoluteAtom("_end");
|
||||||
|
@ -268,7 +268,7 @@ ELFExecutableWriter<ELFT>::writeFile(const lld::File &file, StringRef path) {
|
||||||
_elfHeader->e_shnum(_shdrtab->numHeaders());
|
_elfHeader->e_shnum(_shdrtab->numHeaders());
|
||||||
_elfHeader->e_shstrndx(_shstrtab->ordinal());
|
_elfHeader->e_shstrndx(_shstrtab->ordinal());
|
||||||
uint64_t virtualAddr = 0;
|
uint64_t virtualAddr = 0;
|
||||||
_layout->findAtomAddrByName("_start", virtualAddr);
|
_layout->findAtomAddrByName(_targetInfo.getEntry(), virtualAddr);
|
||||||
_elfHeader->e_entry(virtualAddr);
|
_elfHeader->e_entry(virtualAddr);
|
||||||
|
|
||||||
// HACK: We have to write out the header and program header here even though
|
// HACK: We have to write out the header and program header here even though
|
||||||
|
|
|
@ -70,8 +70,6 @@ public:
|
||||||
virtual uint64_t getPageZeroSize() const { return getPageSize(); }
|
virtual uint64_t getPageZeroSize() const { return getPageSize(); }
|
||||||
|
|
||||||
virtual StringRef getEntry() const {
|
virtual StringRef getEntry() const {
|
||||||
if (_options._outputKind != OutputKind::Executable)
|
|
||||||
return "";
|
|
||||||
if (!_options._entrySymbol.empty())
|
if (!_options._entrySymbol.empty())
|
||||||
return _options._entrySymbol;
|
return _options._entrySymbol;
|
||||||
return "_main";
|
return "_main";
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
# Tests entry point handling
|
||||||
|
#
|
||||||
|
# Test generated using the source file below:
|
||||||
|
#
|
||||||
|
# int main()
|
||||||
|
# {
|
||||||
|
# return 0;
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
|
||||||
|
# RUN: lld-core -reader YAML %s -writer ELF --entry=_entrypoint -o %t1
|
||||||
|
# RUN: llvm-nm -n %t1 | FileCheck %s
|
||||||
|
#
|
||||||
|
# CHECK: 000000a0 T main
|
||||||
|
# CHECK: 00001000 A _end
|
||||||
|
# CHECK: 00001000 A end
|
||||||
|
# CHECK: w _entrypoint
|
||||||
|
|
||||||
|
defined-atoms:
|
||||||
|
- name: .text
|
||||||
|
alignment: 2^4
|
||||||
|
section-choice: custom-required
|
||||||
|
section-name: .text
|
||||||
|
- name: main
|
||||||
|
scope: global
|
||||||
|
content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00,
|
||||||
|
00, C3 ]
|
||||||
|
alignment: 2^4
|
||||||
|
section-choice: custom-required
|
||||||
|
section-name: .text
|
||||||
|
- name: .data
|
||||||
|
type: data
|
||||||
|
alignment: 2^2
|
||||||
|
section-choice: custom-required
|
||||||
|
section-name: .data
|
||||||
|
- name: .bss
|
||||||
|
type: zero-fill
|
||||||
|
alignment: 2^2
|
||||||
|
section-choice: custom-required
|
||||||
|
section-name: .bss
|
||||||
|
- name: .note.GNU-stack
|
||||||
|
section-choice: custom-required
|
||||||
|
section-name: .note.GNU-stack
|
||||||
|
permissions: r--
|
||||||
|
- name: .eh_frame
|
||||||
|
content: [ 14, 00, 00, 00, 00, 00, 00, 00, 01, 7A, 52, 00,
|
||||||
|
01, 78, 10, 01, 1B, 0C, 07, 08, 90, 01, 00, 00,
|
||||||
|
14, 00, 00, 00, 1C, 00, 00, 00, 00, 00, 00, 00,
|
||||||
|
0E, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 ]
|
||||||
|
alignment: 2^3
|
||||||
|
section-choice: custom-required
|
||||||
|
section-name: .eh_frame
|
||||||
|
permissions: r--
|
||||||
|
references:
|
||||||
|
- kind: call32
|
||||||
|
offset: 32
|
||||||
|
target: .text
|
|
@ -92,6 +92,11 @@ llvm::cl::opt<bool>
|
||||||
cmdLineGlobalsNotDeadStrip("keep-globals",
|
cmdLineGlobalsNotDeadStrip("keep-globals",
|
||||||
llvm::cl::desc("All global symbols are roots for dead-strip"));
|
llvm::cl::desc("All global symbols are roots for dead-strip"));
|
||||||
|
|
||||||
|
llvm::cl::opt<std::string>
|
||||||
|
cmdLineEntryPoint("entry",
|
||||||
|
llvm::cl::desc("Specify entry point symbol"),
|
||||||
|
llvm::cl::value_desc("symbol"));
|
||||||
|
|
||||||
|
|
||||||
enum WriteChoice {
|
enum WriteChoice {
|
||||||
writeYAML, writeMachO, writePECOFF, writeELF
|
writeYAML, writeMachO, writePECOFF, writeELF
|
||||||
|
@ -221,6 +226,7 @@ int main(int argc, char *argv[]) {
|
||||||
lo._globalsAreDeadStripRoots = cmdLineGlobalsNotDeadStrip;
|
lo._globalsAreDeadStripRoots = cmdLineGlobalsNotDeadStrip;
|
||||||
lo._forceLoadArchives = cmdLineForceLoad;
|
lo._forceLoadArchives = cmdLineForceLoad;
|
||||||
lo._outputKind = OutputKind::Executable;
|
lo._outputKind = OutputKind::Executable;
|
||||||
|
lo._entrySymbol = cmdLineEntryPoint;
|
||||||
|
|
||||||
switch (archSelected) {
|
switch (archSelected) {
|
||||||
case i386:
|
case i386:
|
||||||
|
|
Loading…
Reference in New Issue