1
1
mirror of https://github.com/rui314/mold.git synced 2024-12-26 01:44:29 +03:00

temporary

This commit is contained in:
Rui Ueyama 2020-11-07 12:14:37 +09:00
parent ea2f2825db
commit 10c1716443
3 changed files with 67 additions and 42 deletions

View File

@ -15,46 +15,6 @@ InputSection::InputSection(ObjectFile *file, const ELF64LE::Shdr &shdr, StringRe
error(toString(file) + ": section sh_addralign is not a power of two");
}
static StringPiece *binary_search(ArrayRef<StringPiece *> pieces, u32 offset) {
while (!pieces.empty()) {
u32 mid = pieces.size() / 2;
StringPiece *piece = pieces[mid];
if (piece->input_offset == offset)
return piece;
if (offset < piece->input_offset)
pieces = pieces.slice(0, mid);
else
pieces = pieces.slice(mid);
}
return nullptr;
}
void InputSection::set_relocations(ArrayRef<ELF64LE::Rela> rels) {
this->rel_pieces.resize(rels.size());
for (int i = 0; i < rels.size(); i++) {
const ELF64LE::Rela &rel = rels[i];
u32 sym_idx = rel.getSymbol(false);
if (file->first_global <= sym_idx)
continue;
Symbol *sym = file->symbols[sym_idx];
ArrayRef<StringPiece *> pieces = sym->input_section->pieces;
if (pieces.empty())
continue;
u32 offset = sym->value + rel.r_addend;
StringPiece *piece = binary_search(pieces, offset);
if (!piece)
error(toString(this) + ": bad relocation at " + std::to_string(sym_idx));
rel_pieces[i].piece = piece;
rel_pieces[i].input_offset = piece->input_offset - offset;
}
}
void InputSection::copy_to(u8 *buf) {
if (shdr.sh_type == SHT_NOBITS || shdr.sh_size == 0)
return;

5
mold.h
View File

@ -225,17 +225,17 @@ class InputSection {
public:
InputSection(ObjectFile *file, const ELF64LE::Shdr &shdr, StringRef name);
void set_relocations(ArrayRef<ELF64LE::Rela> rels);
void copy_to(u8 *buf);
void scan_relocations();
ObjectFile *file;
OutputSection *output_section;
ArrayRef<ELF64LE::Rela> rels;
std::vector<StringPieceRef> rel_pieces;
std::vector<StringPiece *> pieces;
const ELF64LE::Shdr &shdr;
std::vector<StringPieceRef> rel_pieces;
StringRef name;
u64 offset;
};
@ -577,6 +577,7 @@ private:
std::vector<std::pair<ComdatGroup *, u32>> comdat_groups;
std::vector<Symbol> local_symbols;
std::vector<StringPieceRef> sym_pieces;
bool has_common_symbol;
ArrayRef<ELF64LE::Shdr> elf_sections;

View File

@ -145,10 +145,74 @@ void ObjectFile::initialize_symbols() {
}
}
static StringPiece *binary_search(ArrayRef<StringPiece *> pieces, u32 offset) {
if (offset < pieces[0]->input_offset)
return nullptr;
while (pieces.size() > 1) {
u32 mid = pieces.size() / 2;
StringPiece *piece = pieces[mid];
if (offset < piece->input_offset)
pieces = pieces.slice(0, mid);
else
pieces = pieces.slice(mid);
}
return pieces[0];
}
void ObjectFile::initialize_mergeable_sections() {
for (InputSection *isec : sections)
if (isec && (isec->shdr.sh_flags & SHF_STRINGS) && isec->shdr.sh_entsize == 1)
read_string_pieces(isec);
// Initialize rel_pieces
for (InputSection *isec : sections) {
if (!isec || isec->rels.empty())
continue;
isec->rel_pieces.resize(isec->rels.size());
for (int i = 0; i < isec->rels.size(); i++) {
const ELF64LE::Rela &rel = isec->rels[i];
u32 sym_idx = rel.getSymbol(false);
if (sym_idx >= this->first_global)
continue;
Symbol *sym = symbols[sym_idx];
ArrayRef<StringPiece *> pieces = sym->input_section->pieces;
if (pieces.empty())
continue;
u32 offset = sym->value + rel.r_addend;
StringPiece *piece = binary_search(pieces, offset);
if (!piece)
error(toString(this) + ": bad relocation at " + std::to_string(sym_idx));
isec->rel_pieces[i].piece = piece;
isec->rel_pieces[i].input_offset = piece->input_offset - offset;
}
}
// Initialize sym_pieces
sym_pieces.resize(elf_syms.size());
for (int i = 0; i < elf_syms.size(); i++) {
const ELF64LE::Sym &esym = elf_syms[i];
if (esym.isAbsolute() || esym.isCommon())
continue;
InputSection *isec = sections[esym.st_shndx];
if (!isec || isec->pieces.empty())
continue;
StringPiece *piece = binary_search(isec->pieces, esym.st_value);
if (!piece)
error(toString(this) + ": bad symbol value");
sym_pieces[i].piece = piece;
sym_pieces[i].input_offset = piece->input_offset - esym.st_value;
}
}
void ObjectFile::read_string_pieces(InputSection *isec) {