mirror of
https://github.com/rui314/mold.git
synced 2024-09-22 02:20:51 +03:00
temporary
This commit is contained in:
parent
b7ece22197
commit
b31308dc78
@ -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
15
main.cc
@ -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
17
mold.h
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user