SectionOrder getSectionOrder(StringRef name, int32_t contentType,
int32_t contentPermissions) override;
- /// \brief This maps the input sections to the output section names
- virtual StringRef getSectionName(const DefinedAtom *da) const;
+ /// \brief Return the name of the input section by decoding the input
+ /// sectionChoice.
+ virtual StringRef getInputSectionName(const DefinedAtom *da) const;
+
+ /// \brief Return the name of the output section from the input section.
+ virtual StringRef getOutputSectionName(StringRef inputSectionName) const;
/// \brief Gets or creates a section.
AtomSection<ELFT> *getSection(
/// \brief This maps the input sections to the output section names
template <class ELFT>
-StringRef DefaultLayout<ELFT>::getSectionName(const DefinedAtom *da) const {
+StringRef
+DefaultLayout<ELFT>::getInputSectionName(const DefinedAtom *da) const {
if (da->sectionChoice() == DefinedAtom::sectionBasedOnContent) {
switch (da->contentType()) {
case DefinedAtom::typeCode:
break;
}
}
- return llvm::StringSwitch<StringRef>(da->customSectionName())
+ return da->customSectionName();
+}
+
+/// \brief This maps the input sections to the output section names.
+template <class ELFT>
+StringRef
+DefaultLayout<ELFT>::getOutputSectionName(StringRef inputSectionName) const {
+ return llvm::StringSwitch<StringRef>(inputSectionName)
.StartsWith(".text", ".text")
.StartsWith(".ctors", ".ctors")
.StartsWith(".dtors", ".dtors")
.StartsWith(".tbss", ".tbss")
.StartsWith(".init_array", ".init_array")
.StartsWith(".fini_array", ".fini_array")
- .Default(da->customSectionName());
+ .Default(inputSectionName);
}
/// \brief Gets the segment for a output section
getSectionOrder(sectionName, contentType, permissions);
AtomSection<ELFT> *newSec =
createSection(sectionName, contentType, permissions, sectionOrder);
+ newSec->setOutputSectionName(getOutputSectionName(sectionName));
newSec->setOrder(sectionOrder);
_sections.push_back(newSec);
_sectionMap.insert(std::make_pair(sectionKey, newSec));
definedAtom->permissions();
const DefinedAtom::ContentType contentType = definedAtom->contentType();
- StringRef sectionName = getSectionName(definedAtom);
+ StringRef sectionName = getInputSectionName(definedAtom);
AtomSection<ELFT> *section =
getSection(sectionName, contentType, permissions);
OutputSection<ELFT> *outputSection;
for (auto &si : _sections) {
+ Section<ELFT> *section = dyn_cast<Section<ELFT>>(si);
+ if (!section)
+ continue;
const std::pair<StringRef, OutputSection<ELFT> *> currentOutputSection(
- si->name(), nullptr);
+ section->outputSectionName(), nullptr);
std::pair<typename OutputSectionMapT::iterator, bool> outputSectionInsert(
_outputSectionMap.insert(currentOutputSection));
if (!outputSectionInsert.second) {
outputSection = outputSectionInsert.first->second;
} else {
outputSection = new (_allocator.Allocate<OutputSection<ELFT>>())
- OutputSection<ELFT>(si->name());
+ OutputSection<ELFT>(section->outputSectionName());
_outputSections.push_back(outputSection);
outputSectionInsert.first->second = outputSection;
}
/// \brief An ELF section.
template <class ELFT> class Section : public Chunk<ELFT> {
public:
- Section(const ELFLinkingContext &context, StringRef name,
+ Section(const ELFLinkingContext &context, StringRef sectionName,
+ StringRef chunkName,
typename Chunk<ELFT>::Kind k = Chunk<ELFT>::Kind::ELFSection)
- : Chunk<ELFT>(name, k, context), _outputSection(nullptr), _flags(0),
+ : Chunk<ELFT>(chunkName, k, context), _outputSection(nullptr), _flags(0),
_entSize(0), _type(0), _link(0), _info(0),
- _isFirstSectionInOutputSection(false), _segmentType(SHT_NULL) {}
+ _isFirstSectionInOutputSection(false), _segmentType(SHT_NULL),
+ _inputSectionName(sectionName), _outputSectionName(sectionName) {}
/// \brief Modify the section contents before assigning virtual addresses
// or assigning file offsets
: this->_align2;
}
+ virtual StringRef inputSectionName() const { return _inputSectionName; }
+
+ virtual StringRef outputSectionName() const { return _outputSectionName; }
+
+ virtual void setOutputSectionName(StringRef outputSectionName) {
+ _outputSectionName = outputSectionName;
+ }
+
protected:
/// \brief OutputSection this Section is a member of, or nullptr.
OutputSection<ELFT> *_outputSection;
bool _isFirstSectionInOutputSection;
/// \brief the output ELF segment type of this section.
Layout::SegmentType _segmentType;
+ /// \brief Input section name.
+ StringRef _inputSectionName;
+ /// \brief Output section name.
+ StringRef _outputSectionName;
};
/// \brief A section containing atoms.
template <class ELFT> class AtomSection : public Section<ELFT> {
public:
- AtomSection(const ELFLinkingContext &context, StringRef name,
+ AtomSection(const ELFLinkingContext &context, StringRef sectionName,
int32_t contentType, int32_t permissions, int32_t order)
- : Section<ELFT>(context, name, Chunk<ELFT>::Kind::AtomSection),
+ : Section<ELFT>(context, sectionName, "AtomSection",
+ Chunk<ELFT>::Kind::AtomSection),
_contentType(contentType), _contentPermissions(permissions),
_isLoadedInMemory(true) {
this->setOrder(order);
template <class ELFT>
StringTable<ELFT>::StringTable(const ELFLinkingContext &context,
const char *str, int32_t order, bool dynamic)
- : Section<ELFT>(context, str) {
+ : Section<ELFT>(context, str, "StringTable") {
// the string table has a NULL entry for which
// add an empty string
_strings.push_back("");
template <class ELFT>
SymbolTable<ELFT>::SymbolTable(const ELFLinkingContext &context,
const char *str, int32_t order)
- : Section<ELFT>(context, str) {
+ : Section<ELFT>(context, str, "SymbolTable") {
this->setOrder(order);
Elf_Sym symbol;
std::memset(&symbol, 0, sizeof(Elf_Sym));
RelocationTable(const ELFLinkingContext &context, StringRef str,
int32_t order)
- : Section<ELFT>(context, str), _symbolTable(nullptr) {
+ : Section<ELFT>(context, str, "RelocationTable"), _symbolTable(nullptr) {
this->setOrder(order);
this->_flags = SHF_ALLOC;
// Set the alignment properly depending on the target architecture
DynamicTable(const ELFLinkingContext &context, TargetLayout<ELFT> &layout,
StringRef str, int32_t order)
- : Section<ELFT>(context, str), _layout(layout) {
+ : Section<ELFT>(context, str, "DynamicSection"), _layout(layout) {
this->setOrder(order);
this->_entSize = sizeof(Elf_Dyn);
this->_align2 = ELFT::Is64Bits ? 8 : 4;
public:
InterpSection(const ELFLinkingContext &context, StringRef str, int32_t order,
StringRef interp)
- : Section<ELFT>(context, str), _interp(interp) {
+ : Section<ELFT>(context, str, "Dynamic:Interp"), _interp(interp) {
this->setOrder(order);
this->_align2 = 1;
// + 1 for null term.
public:
HashSection(const ELFLinkingContext &context, StringRef name, int32_t order)
- : Section<ELFT>(context, name), _symbolTable(nullptr) {
+ : Section<ELFT>(context, name, "Dynamic:Hash"), _symbolTable(nullptr) {
this->setOrder(order);
this->_entSize = 4;
this->_type = SHT_HASH;
public:
EHFrameHeader(const ELFLinkingContext &context, StringRef name,
TargetLayout<ELFT> &layout, int32_t order)
- : Section<ELFT>(context, name), _layout(layout) {
+ : Section<ELFT>(context, name, "EHFrameHeader"), _layout(layout) {
this->setOrder(order);
this->_entSize = 0;
this->_type = SHT_PROGBITS;