[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