1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-22 02:20:51 +03:00

temporary

This commit is contained in:
Rui Ueyama 2020-12-16 18:38:13 +09:00
parent b7ece22197
commit b31308dc78
3 changed files with 38 additions and 47 deletions

View File

@ -164,61 +164,52 @@ void InputSection::scan_relocations() {
break;
case R_X86_64_32:
case R_X86_64_32S:
case R_X86_64_64: {
case R_X86_64_64:
if (!sym.is_imported) {
rel_types[i] = R_ABS;
break;
}
std::lock_guard lock(sym.mu);
if (sym.type == STT_OBJECT) {
sym.needs_copyrel = true;
sym.flags |= NEEDS_COPYREL;
rel_types[i] = R_ABS;
} else {
sym.needs_plt = true;
sym.flags |= NEEDS_PLT;
rel_types[i] = R_PLT;
}
break;
}
case R_X86_64_PC32:
case R_X86_64_PC64: {
case R_X86_64_PC64:
if (!sym.is_imported) {
rel_types[i] = R_PC;
break;
}
std::lock_guard lock(sym.mu);
if (sym.type == STT_OBJECT) {
sym.needs_copyrel = true;
sym.flags |= NEEDS_COPYREL;
rel_types[i] = R_PC;
} else {
sym.needs_plt = true;
sym.flags |= NEEDS_PLT;
rel_types[i] = R_PLT;
}
break;
}
case R_X86_64_GOT32:{
std::lock_guard lock(sym.mu);
sym.needs_got = true;
case R_X86_64_GOT32:
sym.flags |= NEEDS_GOT;
rel_types[i] = R_GOT;
break;
}
case R_X86_64_GOTPC32: {
std::lock_guard lock(sym.mu);
sym.needs_got = true;
case R_X86_64_GOTPC32:
sym.flags |= NEEDS_GOT;
rel_types[i] = R_GOTPC;
break;
}
case R_X86_64_GOTPCREL:
case R_X86_64_GOTPCRELX:
case R_X86_64_REX_GOTPCRELX: {
std::lock_guard lock(sym.mu);
sym.needs_got = true;
case R_X86_64_REX_GOTPCRELX:
sym.flags |= NEEDS_GOT;
rel_types[i] = R_GOTPCREL;
break;
}
case R_X86_64_PLT32:
if (sym.is_imported || sym.type == STT_GNU_IFUNC) {
std::lock_guard lock(sym.mu);
sym.needs_plt = true;
sym.flags |= NEEDS_PLT;
rel_types[i] = R_PLT;
} else {
rel_types[i] = R_PC;
@ -227,9 +218,9 @@ void InputSection::scan_relocations() {
case R_X86_64_TLSGD:
if (rels[i + 1].r_type != R_X86_64_PLT32)
error(to_string(this) + ": TLSGD reloc not followed by PLT32");
if (sym.is_imported) {
std::lock_guard lock(sym.mu);
sym.needs_tlsgd = true;
sym.flags |= NEEDS_TLSGD;
rel_types[i] = R_TLSGD;
} else {
rel_types[i] = R_TLSGD_RELAX_LE;
@ -239,9 +230,9 @@ void InputSection::scan_relocations() {
case R_X86_64_TLSLD:
if (rels[i + 1].r_type != R_X86_64_PLT32)
error(to_string(this) + ": TLSLD reloc not followed by PLT32");
if (sym.is_imported) {
std::lock_guard lock(sym.mu);
sym.needs_tlsld = true;
sym.flags |= NEEDS_TLSLD;
rel_types[i] = R_TLSLD;
} else {
rel_types[i] = R_TLSLD_RELAX_LE;
@ -254,12 +245,10 @@ void InputSection::scan_relocations() {
case R_X86_64_DTPOFF64:
rel_types[i] = R_TPOFF;
break;
case R_X86_64_GOTTPOFF: {
std::lock_guard lock(sym.mu);
sym.needs_gottpoff = true;
case R_X86_64_GOTTPOFF:
sym.flags |= NEEDS_GOTTPOFF;
rel_types[i] = R_GOTTPOFF;
break;
}
default:
error(to_string(this) + ": unknown relocation: " + std::to_string(rel.r_type));
}

15
main.cc
View File

@ -326,8 +326,7 @@ static void scan_rels() {
tbb::parallel_for(0, (int)files.size(), [&](int i) {
for (Symbol *sym : files[i]->symbols)
if (sym->file == files[i])
if (sym->needs_got || sym->needs_plt || sym->needs_gottpoff ||
sym->needs_tlsgd || sym->needs_tlsld || sym->needs_copyrel)
if (sym->flags)
vec[i].push_back(sym);
});
@ -336,22 +335,22 @@ static void scan_rels() {
if (sym->is_imported)
out::dynsym->add_symbol(sym);
if (sym->needs_got)
if (sym->flags & NEEDS_GOT)
out::got->add_got_symbol(sym);
if (sym->needs_plt)
if (sym->flags & NEEDS_PLT)
out::plt->add_symbol(sym);
if (sym->needs_gottpoff)
if (sym->flags & NEEDS_GOTTPOFF)
out::got->add_gottpoff_symbol(sym);
if (sym->needs_tlsgd)
if (sym->flags & NEEDS_TLSGD)
out::got->add_tlsgd_symbol(sym);
if (sym->needs_tlsld)
if (sym->flags & NEEDS_TLSLD)
out::got->add_tlsld_symbol(sym);
if (sym->needs_copyrel) {
if (sym->flags & NEEDS_COPYREL) {
out::copyrel->add_symbol(sym);
assert(sym->file->is_dso);

17
mold.h
View File

@ -149,6 +149,15 @@ struct StringPieceRef {
i32 addend = 0;
};
enum {
NEEDS_GOT = 1 << 0,
NEEDS_PLT = 1 << 1,
NEEDS_GOTTPOFF = 1 << 2,
NEEDS_TLSGD = 1 << 3,
NEEDS_TLSLD = 1 << 4,
NEEDS_COPYREL = 1 << 5,
};
class Symbol {
public:
Symbol(std::string_view name) : name(name) {}
@ -195,13 +204,7 @@ public:
u8 is_undef_weak : 1 = false;
u8 traced : 1 = false;
u8 needs_got : 1 = false;
u8 needs_plt : 1 = false;
u8 needs_gottpoff : 1 = false;
u8 needs_tlsgd : 1 = false;
u8 needs_tlsld : 1 = false;
u8 needs_copyrel : 1 = false;
std::atomic_uint8_t flags = ATOMIC_VAR_INIT(0);
u8 type = STT_NOTYPE;
};