[lld] r184055 - [ELF] add NMAGIC/OMAGIC support
Shankar Easwaran
shankare at codeaurora.org
Sat Jun 15 22:06:28 PDT 2013
Author: shankare
Date: Sun Jun 16 00:06:28 2013
New Revision: 184055
URL: http://llvm.org/viewvc/llvm-project?rev=184055&view=rev
Log:
[ELF] add NMAGIC/OMAGIC support
Added:
lld/trunk/test/elf/X86_64/Inputs/nmagic.c
lld/trunk/test/elf/X86_64/Inputs/nmagic.o
lld/trunk/test/elf/X86_64/nmagic.test
lld/trunk/test/elf/X86_64/omagic.test
Modified:
lld/trunk/include/lld/ReaderWriter/ELFTargetInfo.h
lld/trunk/lib/Driver/GnuLdDriver.cpp
lld/trunk/lib/Driver/LDOptions.td
lld/trunk/lib/ReaderWriter/ELF/Chunk.h
lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
lld/trunk/lib/ReaderWriter/ELF/HeaderChunks.h
lld/trunk/lib/ReaderWriter/ELF/Reader.cpp
lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.h
Modified: lld/trunk/include/lld/ReaderWriter/ELFTargetInfo.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFTargetInfo.h?rev=184055&r1=184054&r2=184055&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ELFTargetInfo.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ELFTargetInfo.h Sun Jun 16 00:06:28 2013
@@ -35,10 +35,18 @@ public:
class ELFTargetInfo : public TargetInfo {
public:
+ enum class OutputMagic : uint8_t {
+ DEFAULT, // The default mode, no specific magic set
+ NMAGIC, // Disallow shared libraries and dont align sections
+ // PageAlign Data, Mark Text Segment/Data segment RW
+ OMAGIC // Disallow shared libraries and dont align sections,
+ // Mark Text Segment/Data segment RW
+ };
llvm::Triple getTriple() const { return _triple; }
virtual bool is64Bits() const;
virtual bool isLittleEndian() const;
virtual uint64_t getPageSize() const { return 0x1000; }
+ OutputMagic getOutputMagic() const { return _outputMagic; }
uint16_t getOutputType() const { return _outputFileType; }
uint16_t getOutputMachine() const;
bool outputYAML() const { return _outputYAML; }
@@ -64,6 +72,16 @@ public:
}
virtual bool validateImpl(raw_ostream &diagnostics);
+ /// \brief Does the linker allow dynamic libraries to be linked with ?
+ /// This is true when the output mode of the executable is set to be
+ /// having NMAGIC/OMAGIC
+ virtual bool allowLinkWithDynamicLibraries() const {
+ if (_outputMagic == OutputMagic::NMAGIC ||
+ _outputMagic == OutputMagic::OMAGIC ||
+ _noAllowDynamicLibraries)
+ return false;
+ return true;
+ }
virtual error_code parseFile(std::unique_ptr<MemoryBuffer> &mb,
std::vector<std::unique_ptr<File>> &result) const;
@@ -121,6 +139,15 @@ public:
_dynamicLinkerPath = dynamicLinker;
}
+ /// \brief Set NMAGIC output kind when the linker specifies --nmagic
+ /// or -n in the command line
+ /// Set OMAGIC output kind when the linker specifies --omagic
+ /// or -N in the command line
+ virtual void setOutputMagic(OutputMagic magic) { _outputMagic = magic; }
+
+ /// \brief Disallow dynamic libraries during linking
+ virtual void setNoAllowDynamicLibraries() { _noAllowDynamicLibraries = true; }
+
void appendSearchPath(StringRef dirPath) {
_inputSearchPaths.push_back(dirPath);
}
@@ -145,6 +172,8 @@ protected:
bool _runLayoutPass;
bool _useShlibUndefines;
bool _dynamicLinkerArg;
+ bool _noAllowDynamicLibraries;
+ OutputMagic _outputMagic;
std::vector<StringRef> _inputSearchPaths;
llvm::BumpPtrAllocator _extraStrings;
std::unique_ptr<Reader> _elfReader;
Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=184055&r1=184054&r2=184055&view=diff
==============================================================================
--- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)
+++ lld/trunk/lib/Driver/GnuLdDriver.cpp Sun Jun 16 00:06:28 2013
@@ -198,6 +198,25 @@ GnuLdDriver::parse(int argc, const char
parsedArgs->getLastArg(OPT_dynamic_linker))
options->setInterpreter(dynamicLinker->getValue());
+ // Handle NMAGIC
+ if (parsedArgs->getLastArg(OPT_nmagic))
+ options->setOutputMagic(ELFTargetInfo::OutputMagic::NMAGIC);
+
+ // Handle OMAGIC
+ if (parsedArgs->getLastArg(OPT_omagic))
+ options->setOutputMagic(ELFTargetInfo::OutputMagic::OMAGIC);
+
+ // Handle --no-omagic
+ if (parsedArgs->getLastArg(OPT_no_omagic)) {
+ options->setOutputMagic(ELFTargetInfo::OutputMagic::DEFAULT);
+ options->setNoAllowDynamicLibraries();
+ }
+
+ // If either of the options NMAGIC/OMAGIC have been set, make the executable
+ // static
+ if (!options->allowLinkWithDynamicLibraries())
+ options->setIsStaticExecutable(true);
+
// Handle -Lxxx
for (llvm::opt::arg_iterator it = parsedArgs->filtered_begin(OPT_L),
ie = parsedArgs->filtered_end();
Modified: lld/trunk/lib/Driver/LDOptions.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/LDOptions.td?rev=184055&r1=184054&r2=184055&view=diff
==============================================================================
--- lld/trunk/lib/Driver/LDOptions.td (original)
+++ lld/trunk/lib/Driver/LDOptions.td Sun Jun 16 00:06:28 2013
@@ -61,6 +61,17 @@ def allow_shlib_undefs : Flag<["--"], "a
def use_shlib_undefs: Flag<["--"], "use-shlib-undefines">,
HelpText<"Resolve undefined symbols from dynamic libraries">;
+def nmagic : Flag<["--"], "nmagic">,
+ HelpText<"Turn off page alignment of sections, and disable linking against shared libraries">;
+def nmagic_alias : Flag<["-"], "n">, Alias<nmagic>;
+
+def omagic : Flag<["--"], "omagic">,
+ HelpText<"Set the text and data sections to be readable and writable. Also, do not page-align the data segment, and disable linking against shared libraries.">;
+def omagic_alias : Flag<["-"], "N">, Alias<omagic>;
+
+def no_omagic : Flag<["--"], "no-omagic">,
+ HelpText<"This option negates most of the effects of the -N option. Disable linking with shared libraries">;
+
// extensions
def emit_yaml : Flag<["-"], "emit-yaml">,
HelpText<"Write YAML instead of ELF">;
Modified: lld/trunk/lib/ReaderWriter/ELF/Chunk.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Chunk.h?rev=184055&r1=184054&r2=184055&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Chunk.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Chunk.h Sun Jun 16 00:06:28 2013
@@ -41,10 +41,19 @@ public:
K_AtomSection, ///< A section containing atoms.
K_SectionHeader ///< Section header
};
+ /// \brief the ContentType of the chunk
+ enum ContentType {
+ CT_Unknown,
+ CT_Header,
+ CT_Code,
+ CT_Data,
+ CT_Note,
+ CT_Tls,
+ };
+
Chunk(StringRef name, Kind kind, const ELFTargetInfo &ti)
: _name(name), _kind(kind), _fsize(0), _msize(0), _align2(0), _order(0),
- _ordinal(1), _start(0), _fileoffset(0), _targetInfo(ti) {
- }
+ _ordinal(1), _start(0), _fileoffset(0), _targetInfo(ti) {}
virtual ~Chunk() {}
// Does the chunk occupy disk space
virtual bool occupiesNoDiskSpace() const { return false; }
@@ -70,6 +79,8 @@ public:
// Does the chunk occupy memory during execution ?
uint64_t memSize() const { return _msize; }
void setMemSize(uint64_t msize) { _msize = msize; }
+ // Whats the contentType of the chunk ?
+ virtual int getContentType() const = 0;
// Writer the chunk
virtual void write(ELFWriter *writer, llvm::FileOutputBuffer &buffer) = 0;
// Finalize the chunk before assigning offsets/virtual addresses
Modified: lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h?rev=184055&r1=184054&r2=184055&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h Sun Jun 16 00:06:28 2013
@@ -547,8 +547,9 @@ DefaultLayout<ELFT>::mergeSimiliarSectio
template <class ELFT> void DefaultLayout<ELFT>::assignSectionsToSegments() {
ScopedTask task(getDefaultDomain(), "assignSectionsToSegments");
- // TODO: Do we want to give a chance for the targetHandlers
- // to sort segments in an arbitrary order ?
+ ELFTargetInfo::OutputMagic outputMagic = _targetInfo.getOutputMagic();
+ // TODO: Do we want to give a chance for the targetHandlers
+ // to sort segments in an arbitrary order ?
// sort the sections by their order as defined by the layout
std::stable_sort(_sections.begin(), _sections.end(),
[](Chunk<ELFT> *A, Chunk<ELFT> *B) {
@@ -608,6 +609,14 @@ template <class ELFT> void DefaultLayout
segment->append(section);
}
+ // If the output magic is set to OutputMagic::NMAGIC or
+ // OutputMagic::OMAGIC, Place the data alongside text in one single
+ // segment
+ if (outputMagic == ELFTargetInfo::OutputMagic::NMAGIC ||
+ outputMagic == ELFTargetInfo::OutputMagic::OMAGIC)
+ lookupSectionFlag = llvm::ELF::SHF_EXECINSTR | llvm::ELF::SHF_ALLOC |
+ llvm::ELF::SHF_WRITE;
+
// Use the flags of the merged Section for the segment
const SegmentKey key("PT_LOAD", lookupSectionFlag);
const std::pair<SegmentKey, Segment<ELFT> *> currentSegment(key,
@@ -660,6 +669,7 @@ DefaultLayout<ELFT>::assignVirtualAddres
return;
uint64_t virtualAddress = _targetInfo.getBaseAddress();
+ ELFTargetInfo::OutputMagic outputMagic = _targetInfo.getOutputMagic();
// HACK: This is a super dirty hack. The elf header and program header are
// not part of a section, but we need them to be loaded at the base address
@@ -690,9 +700,12 @@ DefaultLayout<ELFT>::assignVirtualAddres
// Dont assign offsets for non loadable segments
if (si->segmentType() != llvm::ELF::PT_LOAD)
continue;
- // Align the segment to a page boundary
- fileoffset =
- llvm::RoundUpToAlignment(fileoffset, _targetInfo.getPageSize());
+ // Align the segment to a page boundary only if the output mode is
+ // not OutputMagic::NMAGIC/OutputMagic::OMAGIC
+ if (outputMagic != ELFTargetInfo::OutputMagic::NMAGIC &&
+ outputMagic != ELFTargetInfo::OutputMagic::OMAGIC)
+ fileoffset =
+ llvm::RoundUpToAlignment(fileoffset, _targetInfo.getPageSize());
si->assignOffsets(fileoffset);
fileoffset = si->fileOffset() + si->fileSize();
}
@@ -707,8 +720,10 @@ DefaultLayout<ELFT>::assignVirtualAddres
// first segment to the pagesize
(*si)->assignVirtualAddress(address);
(*si)->setMemSize(address - virtualAddress);
- virtualAddress = llvm::RoundUpToAlignment(address,
- _targetInfo.getPageSize());
+ if (outputMagic != ELFTargetInfo::OutputMagic::NMAGIC &&
+ outputMagic != ELFTargetInfo::OutputMagic::OMAGIC)
+ virtualAddress =
+ llvm::RoundUpToAlignment(address, _targetInfo.getPageSize());
}
_programHeader->resetProgramHeaders();
}
Modified: lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp?rev=184055&r1=184054&r2=184055&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp Sun Jun 16 00:06:28 2013
@@ -34,7 +34,8 @@ ELFTargetInfo::ELFTargetInfo(llvm::Tripl
_mergeCommonStrings(false),
_runLayoutPass(true),
_useShlibUndefines(false),
- _dynamicLinkerArg(false) {}
+ _dynamicLinkerArg(false),
+ _outputMagic(OutputMagic::DEFAULT) {}
bool ELFTargetInfo::is64Bits() const { return getTriple().isArch64Bit(); }
Modified: lld/trunk/lib/ReaderWriter/ELF/HeaderChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/HeaderChunks.h?rev=184055&r1=184054&r2=184055&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/HeaderChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/HeaderChunks.h Sun Jun 16 00:06:28 2013
@@ -51,6 +51,10 @@ public:
return c->Kind() == Chunk<ELFT>::K_Header;
}
+ inline int getContentType() const {
+ return Chunk<ELFT>::CT_Header;
+ }
+
void write(ELFWriter *writer, llvm::FileOutputBuffer &buffer);
virtual void doPreFlight() {}
@@ -162,6 +166,10 @@ public:
return _ph.size();
}
+ inline int getContentType() const {
+ return Chunk<ELFT>::CT_Header;
+ }
+
private:
Elf_Phdr *allocateProgramHeader(bool &allocatedNew) {
Elf_Phdr *phdr;
@@ -185,6 +193,7 @@ private:
template <class ELFT>
bool ProgramHeader<ELFT>::addSegment(Segment<ELFT> *segment) {
bool allocatedNew = false;
+ ELFTargetInfo::OutputMagic outputMagic = this->_targetInfo.getOutputMagic();
// For segments that are not a loadable segment, we
// just pick the values directly from the segment as there
// wouldnt be any slices within that
@@ -213,8 +222,12 @@ bool ProgramHeader<ELFT>::addSegment(Seg
phdr->p_filesz = slice->fileSize();
phdr->p_memsz = slice->memSize();
phdr->p_flags = segment->flags();
- phdr->p_align = (phdr->p_type == llvm::ELF::PT_LOAD) ?
- segment->pageSize() : slice->align2();
+ if (outputMagic != ELFTargetInfo::OutputMagic::NMAGIC &&
+ outputMagic != ELFTargetInfo::OutputMagic::OMAGIC)
+ phdr->p_align = (phdr->p_type == llvm::ELF::PT_LOAD) ? segment->pageSize()
+ : slice->align2();
+ else
+ phdr->p_align = slice->align2();
}
this->_fsize = fileSize();
this->_msize = this->_fsize;
@@ -266,6 +279,10 @@ public:
return sizeof(Elf_Shdr);
}
+ inline int getContentType() const {
+ return Chunk<ELFT>::CT_Header;
+ }
+
inline uint64_t numHeaders() {
return _sectionInfo.size();
}
Modified: lld/trunk/lib/ReaderWriter/ELF/Reader.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Reader.cpp?rev=184055&r1=184054&r2=184055&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Reader.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Reader.cpp Sun Jun 16 00:06:28 2013
@@ -103,6 +103,10 @@ public:
break;
}
case llvm::sys::fs::file_magic::elf_shared_object: {
+ // If the link doesnot allow dynamic libraries to be present during the
+ // link, lets not parse the file and just return
+ if (!_elfTargetInfo.allowLinkWithDynamicLibraries())
+ return llvm::make_error_code(llvm::errc::executable_format_error);
auto f = createELF<DynamicFileCreateELFTraits>(
getElfArchType(&*mb), MaxAlignment, _elfTargetInfo, std::move(mb));
if (!f)
Modified: lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h?rev=184055&r1=184054&r2=184055&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h Sun Jun 16 00:06:28 2013
@@ -78,6 +78,18 @@ public:
uint32_t getInfo() const { return _info; }
Layout::SegmentType getSegmentType() const { return _segmentType; }
+ /// \brief Return the type of content that the section contains
+ virtual int getContentType() const {
+ if (_flags & llvm::ELF::SHF_EXECINSTR)
+ return Chunk<ELFT>::CT_Code;
+ else if (_flags & llvm::ELF::SHF_WRITE)
+ return Chunk<ELFT>::CT_Data;
+ else if (_flags & llvm::ELF::SHF_ALLOC)
+ return Chunk<ELFT>::CT_Code;
+ else
+ return Chunk<ELFT>::CT_Unknown;
+ }
+
/// \brief convert the segment type to a String for diagnostics and printing
/// purposes
StringRef segmentKindToStr() const;
Modified: lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.h?rev=184055&r1=184054&r2=184055&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.h Sun Jun 16 00:06:28 2013
@@ -114,6 +114,7 @@ public:
Segment(const ELFTargetInfo &ti, StringRef name,
const Layout::SegmentType type);
+ /// \brief the Order of segments that appear in the output file
enum SegmentOrder {
permUnknown,
permRWX,
@@ -199,8 +200,31 @@ public:
return _sections.size();
}
+ /// \brief, this function returns the type of segment (PT_*)
inline Layout::SegmentType segmentType() { return _segmentType; }
+ /// \brief return the segment type depending on the content,
+ /// If the content corresponds to Code, this will return Segment::Code
+ /// If the content corresponds to Data, this will return Segment::Data
+ /// If the content corresponds to TLS, this will return Segment::TLS
+ virtual int getContentType() const {
+ int64_t fl = flags();
+ switch (_segmentType) {
+ case llvm::ELF::PT_LOAD: {
+ if (fl && llvm::ELF::PF_X)
+ return Chunk<ELFT>::CT_Code;
+ if (fl && llvm::ELF::PF_W)
+ return Chunk<ELFT>::CT_Data;
+ }
+ case llvm::ELF::PT_TLS:
+ return Chunk<ELFT>::CT_Tls;
+ case llvm::ELF::PT_NOTE:
+ return Chunk<ELFT>::CT_Note;
+ default:
+ return Chunk<ELFT>::CT_Unknown;
+ }
+ }
+
inline int pageSize() const { return this->_targetInfo.getPageSize(); }
inline int rawflags() const { return _atomflags; }
@@ -246,6 +270,19 @@ public:
return _segmentSlices.end();
}
+private:
+
+ /// \brief Check if the chunk needs to be aligned
+ bool needAlign(Chunk<ELFT> *chunk) const {
+ if (chunk->getContentType() == Chunk<ELFT>::CT_Data &&
+ _outputMagic == ELFTargetInfo::OutputMagic::NMAGIC)
+ return true;
+ return false;
+ }
+
+ // Cached value of outputMagic
+ ELFTargetInfo::OutputMagic _outputMagic;
+
protected:
/// \brief Section or some other chunk type.
std::vector<Chunk<ELFT> *> _sections;
@@ -294,6 +331,7 @@ Segment<ELFT>::Segment(const ELFTargetIn
_flags(0), _atomflags(0) {
this->_align2 = 0;
this->_fsize = 0;
+ _outputMagic = ti.getOutputMagic();
}
// This function actually is used, but not in all instantiations of Segment.
@@ -316,7 +354,7 @@ static DefinedAtom::ContentPermissions t
template <class ELFT> void Segment<ELFT>::append(Section<ELFT> *section) {
_sections.push_back(section);
if (_flags < section->getFlags())
- _flags = section->getFlags();
+ _flags |= section->getFlags();
if (_atomflags < toAtomPerms(_flags))
_atomflags = toAtomPerms(_flags);
if (this->_align2 < section->align2())
@@ -385,8 +423,16 @@ template <class ELFT> void Segment<ELFT>
endSectionIter = _sections.end();
startSection = 0;
bool isFirstSection = true;
+ bool isDataPageAlignedForNMagic = false;
for (auto si = _sections.begin(); si != _sections.end(); ++si) {
if (isFirstSection) {
+ // If the linker outputmagic is set to OutputMagic::NMAGIC, align the Data
+ // to a page boundary
+ if (!isDataPageAlignedForNMagic && needAlign(*si)) {
+ startOffset = llvm::RoundUpToAlignment(startOffset,
+ this->_targetInfo.getPageSize());
+ isDataPageAlignedForNMagic = true;
+ }
// align the startOffset to the section alignment
uint64_t newOffset =
llvm::RoundUpToAlignment(startOffset, (*si)->align2());
@@ -398,12 +444,21 @@ template <class ELFT> void Segment<ELFT>
isFirstSection = false;
} else {
uint64_t curOffset = curSliceFileOffset + curSliceSize;
- uint64_t newOffset =
- llvm::RoundUpToAlignment(curOffset, (*si)->align2());
+ // If the linker outputmagic is set to OutputMagic::NMAGIC, align the Data
+ // to a page boundary
+ if (!isDataPageAlignedForNMagic && needAlign(*si)) {
+ curOffset = llvm::RoundUpToAlignment(curOffset,
+ this->_targetInfo.getPageSize());
+ isDataPageAlignedForNMagic = true;
+ }
+ uint64_t newOffset = llvm::RoundUpToAlignment(curOffset, (*si)->align2());
SegmentSlice<ELFT> *slice = nullptr;
// If the newOffset computed is more than a page away, lets create
// a seperate segment, so that memory is not used up while running
- if ((newOffset - curOffset) > this->_targetInfo.getPageSize()) {
+ if (((newOffset - curOffset) > this->_targetInfo.getPageSize()) &&
+ (_outputMagic != ELFTargetInfo::OutputMagic::NMAGIC &&
+ _outputMagic != ELFTargetInfo::OutputMagic::OMAGIC)) {
+
// TODO: use std::find here
for (auto s : slices()) {
if (s->startSection() == startSection) {
@@ -464,16 +519,27 @@ template <class ELFT> void Segment<ELFT>
/// \brief Assign virtual addresses to the slices
template <class ELFT> void Segment<ELFT>::assignVirtualAddress(uint64_t &addr) {
bool isTLSSegment = false;
+ bool isDataPageAlignedForNMagic = false;
uint64_t tlsStartAddr = 0;
for (auto slice : slices()) {
- // Align to a page
- addr = llvm::RoundUpToAlignment(addr, this->_targetInfo.getPageSize());
+ // Align to a page only if the output is not
+ // OutputMagic::NMAGIC/OutputMagic::OMAGIC
+ if (_outputMagic != ELFTargetInfo::OutputMagic::NMAGIC &&
+ _outputMagic != ELFTargetInfo::OutputMagic::OMAGIC)
+ addr = llvm::RoundUpToAlignment(addr, this->_targetInfo.getPageSize());
+
// Align to the slice alignment
addr = llvm::RoundUpToAlignment(addr, slice->align2());
bool virtualAddressSet = false;
for (auto section : slice->sections()) {
+ // If the linker outputmagic is set to OutputMagic::NMAGIC, align the Data
+ // to a page boundary
+ if (!isDataPageAlignedForNMagic && needAlign(section)) {
+ addr = llvm::RoundUpToAlignment(addr, this->_targetInfo.getPageSize());
+ isDataPageAlignedForNMagic = true;
+ }
// Align the section address
addr = llvm::RoundUpToAlignment(addr, section->align2());
// Check if the segment is of type TLS
Added: lld/trunk/test/elf/X86_64/Inputs/nmagic.c
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/Inputs/nmagic.c?rev=184055&view=auto
==============================================================================
--- lld/trunk/test/elf/X86_64/Inputs/nmagic.c (added)
+++ lld/trunk/test/elf/X86_64/Inputs/nmagic.c Sun Jun 16 00:06:28 2013
@@ -0,0 +1,8 @@
+int a = 10;
+__thread int b = 20;
+__thread int c;
+__thread int d;
+
+int main() {
+ return 0;
+}
Added: lld/trunk/test/elf/X86_64/Inputs/nmagic.o
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/Inputs/nmagic.o?rev=184055&view=auto
==============================================================================
Binary files lld/trunk/test/elf/X86_64/Inputs/nmagic.o (added) and lld/trunk/test/elf/X86_64/Inputs/nmagic.o Sun Jun 16 00:06:28 2013 differ
Added: lld/trunk/test/elf/X86_64/nmagic.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/nmagic.test?rev=184055&view=auto
==============================================================================
--- lld/trunk/test/elf/X86_64/nmagic.test (added)
+++ lld/trunk/test/elf/X86_64/nmagic.test Sun Jun 16 00:06:28 2013
@@ -0,0 +1,239 @@
+# This tests verifies functionality of NMAGIC that we create only two segments,
+# PT_LOAD, PT_TLS
+# The data segment should be aligned to a page boundary
+RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/nmagic.o \
+RUN: --noinhibit-exec -o %t --nmagic
+RUN: llvm-readobj -sections %t | FileCheck -check-prefix=NMAGICSECTIONS %s
+RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=NMAGICPROGRAMHEADERS %s
+
+NMAGICSECTIONS: Sections [
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 0
+NMAGICSECTIONS: Name: (0)
+NMAGICSECTIONS: Type: SHT_NULL (0x0)
+NMAGICSECTIONS: Flags [ (0x0)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x0
+NMAGICSECTIONS: Offset: 0x0
+NMAGICSECTIONS: Size: 0
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 0
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 1
+NMAGICSECTIONS: Name: .text (1)
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: Flags [ (0x6)
+NMAGICSECTIONS: SHF_ALLOC (0x2)
+NMAGICSECTIONS: SHF_EXECINSTR (0x4)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x4000B0
+NMAGICSECTIONS: Offset: 0xB0
+NMAGICSECTIONS: Size: 11
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 4
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 2
+NMAGICSECTIONS: Name: .note.GNU-stack (7)
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: Flags [ (0x2)
+NMAGICSECTIONS: SHF_ALLOC (0x2)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x4000BB
+NMAGICSECTIONS: Offset: 0xBB
+NMAGICSECTIONS: Size: 0
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 1
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 3
+NMAGICSECTIONS: Name: .comment (23)
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: Flags [ (0x2)
+NMAGICSECTIONS: SHF_ALLOC (0x2)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x4000BB
+NMAGICSECTIONS: Offset: 0xBB
+NMAGICSECTIONS: Size: 43
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 1
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 4
+NMAGICSECTIONS: Name: .eh_frame (32)
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: Flags [ (0x2)
+NMAGICSECTIONS: SHF_ALLOC (0x2)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x4000E8
+NMAGICSECTIONS: Offset: 0xE8
+NMAGICSECTIONS: Size: 56
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 8
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 5
+NMAGICSECTIONS: Name: .tdata (42)
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: Flags [ (0x403)
+NMAGICSECTIONS: SHF_ALLOC (0x2)
+NMAGICSECTIONS: SHF_TLS (0x400)
+NMAGICSECTIONS: SHF_WRITE (0x1)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x401000
+NMAGICSECTIONS: Offset: 0x1000
+NMAGICSECTIONS: Size: 4
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 4
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 6
+NMAGICSECTIONS: Name: .tbss (49)
+NMAGICSECTIONS: Type: SHT_NOBITS (0x8)
+NMAGICSECTIONS: Flags [ (0x403)
+NMAGICSECTIONS: SHF_ALLOC (0x2)
+NMAGICSECTIONS: SHF_TLS (0x400)
+NMAGICSECTIONS: SHF_WRITE (0x1)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x401004
+NMAGICSECTIONS: Offset: 0x1004
+NMAGICSECTIONS: Size: 8
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 4
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 7
+NMAGICSECTIONS: Name: .got.plt (55)
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: Flags [ (0x3)
+NMAGICSECTIONS: SHF_ALLOC (0x2)
+NMAGICSECTIONS: SHF_WRITE (0x1)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x401008
+NMAGICSECTIONS: Offset: 0x1008
+NMAGICSECTIONS: Size: 0
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 8
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 8
+NMAGICSECTIONS: Name: .data (64)
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: Flags [ (0x3)
+NMAGICSECTIONS: SHF_ALLOC (0x2)
+NMAGICSECTIONS: SHF_WRITE (0x1)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x401008
+NMAGICSECTIONS: Offset: 0x1008
+NMAGICSECTIONS: Size: 4
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 4
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 9
+NMAGICSECTIONS: Name: .bss (70)
+NMAGICSECTIONS: Type: SHT_NOBITS (0x8)
+NMAGICSECTIONS: Flags [ (0x3)
+NMAGICSECTIONS: SHF_ALLOC (0x2)
+NMAGICSECTIONS: SHF_WRITE (0x1)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x40100C
+NMAGICSECTIONS: Offset: 0x100C
+NMAGICSECTIONS: Size: 0
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 4
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 10
+NMAGICSECTIONS: Name: .shstrtab (75)
+NMAGICSECTIONS: Type: SHT_STRTAB (0x3)
+NMAGICSECTIONS: Flags [ (0x0)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x0
+NMAGICSECTIONS: Offset: 0x100C
+NMAGICSECTIONS: Size: 101
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 1
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 11
+NMAGICSECTIONS: Name: .symtab (85)
+NMAGICSECTIONS: Type: SHT_SYMTAB (0x2)
+NMAGICSECTIONS: Flags [ (0x0)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x0
+NMAGICSECTIONS: Offset: 0x1078
+NMAGICSECTIONS: Size: 528
+NMAGICSECTIONS: Link: 12
+NMAGICSECTIONS: Info: 2
+NMAGICSECTIONS: AddressAlignment: 8
+NMAGICSECTIONS: EntrySize: 24
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 12
+NMAGICSECTIONS: Name: .strtab (93)
+NMAGICSECTIONS: Type: SHT_STRTAB (0x3)
+NMAGICSECTIONS: Flags [ (0x0)
+NMAGICSECTIONS: ]
+NMAGICSECTIONS: Address: 0x0
+NMAGICSECTIONS: Offset: 0x1288
+NMAGICSECTIONS: Size: 246
+NMAGICSECTIONS: Link: 0
+NMAGICSECTIONS: Info: 0
+NMAGICSECTIONS: AddressAlignment: 1
+NMAGICSECTIONS: EntrySize: 0
+NMAGICSECTIONS: }
+NMAGICSECTIONS: ]
+
+NMAGICPROGRAMHEADERS: ProgramHeaders [
+NMAGICPROGRAMHEADERS: ProgramHeader {
+NMAGICPROGRAMHEADERS: Type: PT_LOAD (0x1)
+NMAGICPROGRAMHEADERS: Offset: 0x0
+NMAGICPROGRAMHEADERS: VirtualAddress: 0x400000
+NMAGICPROGRAMHEADERS: PhysicalAddress: 0x400000
+NMAGICPROGRAMHEADERS: FileSize: 4108
+NMAGICPROGRAMHEADERS: MemSize: 4108
+NMAGICPROGRAMHEADERS: Flags [ (0x7)
+NMAGICPROGRAMHEADERS: PF_R (0x4)
+NMAGICPROGRAMHEADERS: PF_W (0x2)
+NMAGICPROGRAMHEADERS: PF_X (0x1)
+NMAGICPROGRAMHEADERS: ]
+NMAGICPROGRAMHEADERS: Alignment: 8
+NMAGICPROGRAMHEADERS: }
+NMAGICPROGRAMHEADERS: ProgramHeader {
+NMAGICPROGRAMHEADERS: Type: PT_TLS (0x7)
+NMAGICPROGRAMHEADERS: Offset: 0x1000
+NMAGICPROGRAMHEADERS: VirtualAddress: 0x401000
+NMAGICPROGRAMHEADERS: PhysicalAddress: 0x401000
+NMAGICPROGRAMHEADERS: FileSize: 4
+NMAGICPROGRAMHEADERS: MemSize: 12
+NMAGICPROGRAMHEADERS: Flags [ (0x6)
+NMAGICPROGRAMHEADERS: PF_R (0x4)
+NMAGICPROGRAMHEADERS: PF_W (0x2)
+NMAGICPROGRAMHEADERS: ]
+NMAGICPROGRAMHEADERS: Alignment: 4
+NMAGICPROGRAMHEADERS: }
+NMAGICPROGRAMHEADERS: ]
Added: lld/trunk/test/elf/X86_64/omagic.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/omagic.test?rev=184055&view=auto
==============================================================================
--- lld/trunk/test/elf/X86_64/omagic.test (added)
+++ lld/trunk/test/elf/X86_64/omagic.test Sun Jun 16 00:06:28 2013
@@ -0,0 +1,239 @@
+# This tests verifies functionality of omagic that we create only two segments,
+# PT_LOAD, PT_TLS
+# The data segment should not be aligned to a page boundary
+RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/nmagic.o \
+RUN: --noinhibit-exec -o %t --omagic
+RUN: llvm-readobj -sections %t | FileCheck -check-prefix=OMAGICSECTIONS %s
+RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=OMAGICPROGRAMHEADERS %s
+
+OMAGICSECTIONS: Sections [
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 0
+OMAGICSECTIONS: Name: (0)
+OMAGICSECTIONS: Type: SHT_NULL (0x0)
+OMAGICSECTIONS: Flags [ (0x0)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x0
+OMAGICSECTIONS: Offset: 0x0
+OMAGICSECTIONS: Size: 0
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 0
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 1
+OMAGICSECTIONS: Name: .text (1)
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x6)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_EXECINSTR (0x4)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x4000B0
+OMAGICSECTIONS: Offset: 0xB0
+OMAGICSECTIONS: Size: 11
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 4
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 2
+OMAGICSECTIONS: Name: .note.GNU-stack (7)
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x2)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x4000BB
+OMAGICSECTIONS: Offset: 0xBB
+OMAGICSECTIONS: Size: 0
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 1
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 3
+OMAGICSECTIONS: Name: .comment (23)
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x2)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x4000BB
+OMAGICSECTIONS: Offset: 0xBB
+OMAGICSECTIONS: Size: 43
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 1
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 4
+OMAGICSECTIONS: Name: .eh_frame (32)
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x2)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x4000E8
+OMAGICSECTIONS: Offset: 0xE8
+OMAGICSECTIONS: Size: 56
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 8
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 5
+OMAGICSECTIONS: Name: .tdata (42)
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x403)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_TLS (0x400)
+OMAGICSECTIONS: SHF_WRITE (0x1)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x400120
+OMAGICSECTIONS: Offset: 0x120
+OMAGICSECTIONS: Size: 4
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 4
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 6
+OMAGICSECTIONS: Name: .tbss (49)
+OMAGICSECTIONS: Type: SHT_NOBITS (0x8)
+OMAGICSECTIONS: Flags [ (0x403)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_TLS (0x400)
+OMAGICSECTIONS: SHF_WRITE (0x1)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x400124
+OMAGICSECTIONS: Offset: 0x124
+OMAGICSECTIONS: Size: 8
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 4
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 7
+OMAGICSECTIONS: Name: .got.plt (55)
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x3)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_WRITE (0x1)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x400128
+OMAGICSECTIONS: Offset: 0x128
+OMAGICSECTIONS: Size: 0
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 8
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 8
+OMAGICSECTIONS: Name: .data (64)
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x3)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_WRITE (0x1)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x400128
+OMAGICSECTIONS: Offset: 0x128
+OMAGICSECTIONS: Size: 4
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 4
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 9
+OMAGICSECTIONS: Name: .bss (70)
+OMAGICSECTIONS: Type: SHT_NOBITS (0x8)
+OMAGICSECTIONS: Flags [ (0x3)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_WRITE (0x1)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x40012C
+OMAGICSECTIONS: Offset: 0x12C
+OMAGICSECTIONS: Size: 0
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 4
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 10
+OMAGICSECTIONS: Name: .shstrtab (75)
+OMAGICSECTIONS: Type: SHT_STRTAB (0x3)
+OMAGICSECTIONS: Flags [ (0x0)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x0
+OMAGICSECTIONS: Offset: 0x12C
+OMAGICSECTIONS: Size: 101
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 1
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 11
+OMAGICSECTIONS: Name: .symtab (85)
+OMAGICSECTIONS: Type: SHT_SYMTAB (0x2)
+OMAGICSECTIONS: Flags [ (0x0)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x0
+OMAGICSECTIONS: Offset: 0x198
+OMAGICSECTIONS: Size: 528
+OMAGICSECTIONS: Link: 12
+OMAGICSECTIONS: Info: 2
+OMAGICSECTIONS: AddressAlignment: 8
+OMAGICSECTIONS: EntrySize: 24
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Index: 12
+OMAGICSECTIONS: Name: .strtab (93)
+OMAGICSECTIONS: Type: SHT_STRTAB (0x3)
+OMAGICSECTIONS: Flags [ (0x0)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x0
+OMAGICSECTIONS: Offset: 0x3A8
+OMAGICSECTIONS: Size: 246
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 1
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: ]
+
+OMAGICPROGRAMHEADERS: ProgramHeaders [
+OMAGICPROGRAMHEADERS: ProgramHeader {
+OMAGICPROGRAMHEADERS: Type: PT_LOAD (0x1)
+OMAGICPROGRAMHEADERS: Offset: 0x0
+OMAGICPROGRAMHEADERS: VirtualAddress: 0x400000
+OMAGICPROGRAMHEADERS: PhysicalAddress: 0x400000
+OMAGICPROGRAMHEADERS: FileSize: 300
+OMAGICPROGRAMHEADERS: MemSize: 300
+OMAGICPROGRAMHEADERS: Flags [ (0x7)
+OMAGICPROGRAMHEADERS: PF_R (0x4)
+OMAGICPROGRAMHEADERS: PF_W (0x2)
+OMAGICPROGRAMHEADERS: PF_X (0x1)
+OMAGICPROGRAMHEADERS: ]
+OMAGICPROGRAMHEADERS: Alignment: 8
+OMAGICPROGRAMHEADERS: }
+OMAGICPROGRAMHEADERS: ProgramHeader {
+OMAGICPROGRAMHEADERS: Type: PT_TLS (0x7)
+OMAGICPROGRAMHEADERS: Offset: 0x120
+OMAGICPROGRAMHEADERS: VirtualAddress: 0x400120
+OMAGICPROGRAMHEADERS: PhysicalAddress: 0x400120
+OMAGICPROGRAMHEADERS: FileSize: 4
+OMAGICPROGRAMHEADERS: MemSize: 12
+OMAGICPROGRAMHEADERS: Flags [ (0x6)
+OMAGICPROGRAMHEADERS: PF_R (0x4)
+OMAGICPROGRAMHEADERS: PF_W (0x2)
+OMAGICPROGRAMHEADERS: ]
+OMAGICPROGRAMHEADERS: Alignment: 4
+OMAGICPROGRAMHEADERS: }
+OMAGICPROGRAMHEADERS: ]
More information about the llvm-commits
mailing list