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 getOutputMachine() const;
|
||||
|
||||
virtual StringRef getEntry() const;
|
||||
virtual uint64_t getBaseAddress() const { return _options._baseAddress; }
|
||||
|
||||
static std::unique_ptr<ELFTargetInfo> create(const LinkerOptions &lo);
|
||||
|
|
|
@ -124,9 +124,6 @@ public:
|
|||
|
||||
if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_entry))
|
||||
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))
|
||||
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>();
|
||||
}
|
||||
}
|
||||
|
||||
StringRef ELFTargetInfo::getEntry() const {
|
||||
if (!_options._entrySymbol.empty())
|
||||
return _options._entrySymbol;
|
||||
return "_start";
|
||||
}
|
||||
|
||||
} // end namespace lld
|
||||
|
|
|
@ -149,7 +149,7 @@ void ELFExecutableWriter<ELFT>::assignSectionsWithNoSegments() {
|
|||
/// absolute symbols
|
||||
template<class ELFT>
|
||||
void ELFExecutableWriter<ELFT>::addDefaultAtoms() {
|
||||
_runtimeFile.addUndefinedAtom("_start");
|
||||
_runtimeFile.addUndefinedAtom(_targetInfo.getEntry());
|
||||
_runtimeFile.addAbsoluteAtom("__bss_start");
|
||||
_runtimeFile.addAbsoluteAtom("__bss_end");
|
||||
_runtimeFile.addAbsoluteAtom("_end");
|
||||
|
@ -268,7 +268,7 @@ ELFExecutableWriter<ELFT>::writeFile(const lld::File &file, StringRef path) {
|
|||
_elfHeader->e_shnum(_shdrtab->numHeaders());
|
||||
_elfHeader->e_shstrndx(_shstrtab->ordinal());
|
||||
uint64_t virtualAddr = 0;
|
||||
_layout->findAtomAddrByName("_start", virtualAddr);
|
||||
_layout->findAtomAddrByName(_targetInfo.getEntry(), virtualAddr);
|
||||
_elfHeader->e_entry(virtualAddr);
|
||||
|
||||
// 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 StringRef getEntry() const {
|
||||
if (_options._outputKind != OutputKind::Executable)
|
||||
return "";
|
||||
if (!_options._entrySymbol.empty())
|
||||
return _options._entrySymbol;
|
||||
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",
|
||||
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 {
|
||||
writeYAML, writeMachO, writePECOFF, writeELF
|
||||
|
@ -221,6 +226,7 @@ int main(int argc, char *argv[]) {
|
|||
lo._globalsAreDeadStripRoots = cmdLineGlobalsNotDeadStrip;
|
||||
lo._forceLoadArchives = cmdLineForceLoad;
|
||||
lo._outputKind = OutputKind::Executable;
|
||||
lo._entrySymbol = cmdLineEntryPoint;
|
||||
|
||||
switch (archSelected) {
|
||||
case i386:
|
||||
|
|
Loading…
Reference in New Issue