1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-22 18:40:59 +03:00
mold/input_files.cc

56 lines
1.5 KiB
C++
Raw Normal View History

2020-10-09 14:47:45 +03:00
#include "chibild.h"
2020-10-04 12:00:33 +03:00
using namespace llvm;
2020-10-09 14:47:45 +03:00
using namespace llvm::ELF;
2020-10-04 12:00:33 +03:00
2020-10-09 14:47:45 +03:00
ObjectFile::ObjectFile(MemoryBufferRef mb) : mb(mb) {}
2020-10-04 12:00:33 +03:00
2020-10-09 14:47:45 +03:00
MemoryBufferRef readFile(StringRef path) {
auto mbOrErr = MemoryBuffer::getFile(path, -1, false);
if (auto ec = mbOrErr.getError())
error("cannot open " + path + ": " + ec.message());
2020-10-04 12:00:33 +03:00
2020-10-09 14:47:45 +03:00
std::unique_ptr<MemoryBuffer> &mb = *mbOrErr;
MemoryBufferRef mbref = mb->getMemBufferRef();
mb.release();
return mbref;
}
static const ELF64LE::Shdr
*findSection(ArrayRef<ELF64LE::Shdr> sections, uint32_t type) {
for (const ELF64LE::Shdr &sec : sections)
if (sec.sh_type == type)
return &sec;
return nullptr;
}
void ObjectFile::parse() {
ELFFile<ELF64LE> obj = check(ELFFile<ELF64LE>::create(mb.getBuffer()));
ArrayRef<ELF64LE::Shdr> sections = CHECK(obj.sections(), this);
// Find a symbol table.
bool is_dso = (identify_magic(mb.getBuffer()) == file_magic::elf_shared_object);
const ELF64LE::Shdr *symtab_sec
= findSection(sections, is_dso ? SHT_DYNSYM : SHT_SYMTAB);
int firstGlobal = symtab_sec->sh_info;
ArrayRef<ELF64LE::Sym> syms = CHECK(obj.symbols(symtab_sec), this);
StringRef string_table =
CHECK(obj.getStringTableForSymtab(*symtab_sec, sections), this);
2020-10-09 15:50:13 +03:00
2020-10-09 15:54:11 +03:00
for (const ELF64LE::Sym &sym : syms.slice(firstGlobal))
2020-10-09 15:50:13 +03:00
llvm::errs() << CHECK(sym.getName(string_table), this) << "\n";
2020-10-09 14:47:45 +03:00
}
void ObjectFile::register_defined_symbols() {}
StringRef ObjectFile::getFilename() {
return mb.getBufferIdentifier();
}
std::string toString(ObjectFile *obj) {
return obj->getFilename().str();
}