1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-23 02:49:12 +03:00

temporary

This commit is contained in:
Rui Ueyama 2021-01-14 16:11:03 +09:00
parent 9b7affccb7
commit fc8f710774
2 changed files with 20 additions and 20 deletions

View File

@ -158,6 +158,15 @@ void InputSection::copy_buf() {
write_val(rel.r_type, loc, val);
};
auto write_dynrel = [&](u64 offset, u8 type, u32 symidx, i64 addend) {
memset(dynrel, 0, sizeof(*dynrel));
dynrel->r_offset = offset;
dynrel->r_type = type;
dynrel->r_sym = symidx;
dynrel->r_addend = addend;
dynrel++;
};
#define S (ref ? ref->piece->get_addr() \
: (sym.plt_idx == -1 ? sym.get_addr() : sym.get_plt_addr()))
#define A (ref ? ref->addend : rel.r_addend)
@ -173,19 +182,10 @@ void InputSection::copy_buf() {
break;
case R_ABS_DYN:
write(S + A);
memset(dynrel, 0, sizeof(*dynrel));
dynrel->r_offset = P;
dynrel->r_type = R_X86_64_RELATIVE;
dynrel->r_addend = S + A;
dynrel++;
write_dynrel(P, R_X86_64_RELATIVE, 0, S + A);
break;
case R_DYN:
memset(dynrel, 0, sizeof(*dynrel));
dynrel->r_offset = P;
dynrel->r_type = R_X86_64_64;
dynrel->r_sym = sym.dynsym_idx;
dynrel->r_addend = A;
dynrel++;
write_dynrel(P, R_X86_64_64, sym.dynsym_idx, A);
break;
case R_PC:
write(S + A - P);

View File

@ -169,37 +169,37 @@ void RelDynSection::update_shdr() {
void RelDynSection::copy_buf() {
ElfRela *rel = (ElfRela *)(out::buf + shdr.sh_offset);
auto write = [&](u8 type, Symbol *sym, u64 offset, i64 addend = 0) {
auto write = [&](u64 offset, u8 type, Symbol *sym, i64 addend = 0) {
memset(rel, 0, sizeof(*rel));
rel->r_offset = offset;
rel->r_type = type;
if (sym)
rel->r_sym = sym->dynsym_idx;
rel->r_offset = offset;
rel->r_addend = addend;
rel++;
};
for (Symbol *sym : out::got->got_syms) {
if (sym->is_imported)
write(R_X86_64_GLOB_DAT, sym, sym->get_got_addr());
write(sym->get_got_addr(), R_X86_64_GLOB_DAT, sym);
else if (config.pie && sym->is_relative())
write(R_X86_64_RELATIVE, nullptr, sym->get_got_addr(), sym->get_addr());
write(sym->get_got_addr(), R_X86_64_RELATIVE, nullptr, sym->get_addr());
}
for (Symbol *sym : out::got->tlsgd_syms) {
write(R_X86_64_DTPMOD64, sym, sym->get_tlsgd_addr());
write(R_X86_64_DTPOFF64, sym, sym->get_tlsgd_addr() + GOT_SIZE);
write(sym->get_tlsgd_addr(), R_X86_64_DTPMOD64, sym);
write(sym->get_tlsgd_addr() + GOT_SIZE, R_X86_64_DTPOFF64, sym);
}
for (Symbol *sym : out::got->tlsld_syms)
write(R_X86_64_DTPMOD64, nullptr, sym->get_tlsld_addr());
write(sym->get_tlsld_addr(), R_X86_64_DTPMOD64, nullptr);
for (Symbol *sym : out::got->gottpoff_syms)
if (sym->is_imported)
write(R_X86_64_TPOFF32, sym, sym->get_gottpoff_addr());
write(sym->get_gottpoff_addr(), R_X86_64_TPOFF32, sym);
for (Symbol *sym : out::copyrel->symbols)
write(R_X86_64_COPY, sym, sym->get_addr());
write(sym->get_addr(), R_X86_64_COPY, sym);
}
void StrtabSection::update_shdr() {