[ELF] Use entry point from LinkerOptions.

Patch by Ahmed Bougacha!

llvm-svn: 173655
This commit is contained in:
Michael J. Spencer 2013-01-28 04:15:44 +00:00
parent fa0939f790
commit 990ec2b223
7 changed files with 73 additions and 7 deletions

View File

@ -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);

View File

@ -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),

View File

@ -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

View File

@ -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

View File

@ -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";

57
lld/test/elf/entry.objtxt Normal file
View File

@ -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

View File

@ -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: