1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-22 10:27:48 +03:00

temporary

This commit is contained in:
Rui Ueyama 2020-11-21 10:48:23 +09:00
parent 437d2b3838
commit 6fd54ac100
3 changed files with 31 additions and 12 deletions

View File

@ -416,8 +416,11 @@ static void scan_rels() {
if (sym->flags & Symbol::NEEDS_GOTTPOFF)
out::got->add_gottp_symbol(sym);
if ((sym->flags & Symbol::NEEDS_TLSGD) || (sym->flags & Symbol::NEEDS_TLSLD))
;
if (sym->flags & Symbol::NEEDS_TLSGD)
out::got->add_tlsgd_symbol(sym);
if (sym->flags & Symbol::NEEDS_TLSLD)
out::got->add_tlsld_symbol(sym);
}
}

24
mold.h
View File

@ -199,8 +199,8 @@ public:
inline u64 get_got_addr() const;
inline u64 get_gotplt_addr() const;
inline u64 get_gottp_addr() const;
inline u64 get_gotgd_addr() const;
inline u64 get_gotld_addr() const;
inline u64 get_tlsgd_addr() const;
inline u64 get_tlsld_addr() const;
inline u64 get_plt_addr() const;
StringRef name;
@ -212,8 +212,8 @@ public:
u32 got_idx = -1;
u32 gotplt_idx = -1;
u32 gottp_idx = -1;
u32 gotgd_idx = -1;
u32 gotld_idx = -1;
u32 tlsgd_idx = -1;
u32 tlsld_idx = -1;
u32 plt_idx = -1;
u32 relplt_idx = -1;
u32 dynsym_idx = -1;
@ -413,10 +413,14 @@ public:
void add_symbol(Symbol *sym);
void add_gottp_symbol(Symbol *sym);
void add_tlsgd_symbol(Symbol *sym);
void add_tlsld_symbol(Symbol *sym);
void copy_buf() override;
std::vector<Symbol *> got_syms;
std::vector<Symbol *> gottp_syms;
std::vector<Symbol *> tlsgd_syms;
std::vector<Symbol *> tlsld_syms;
};
class GotPltSection : public OutputChunk {
@ -763,14 +767,14 @@ inline u64 Symbol::get_gottp_addr() const {
return out::got->shdr.sh_addr + gottp_idx * GOT_SIZE;
}
inline u64 Symbol::get_gotgd_addr() const {
assert(gotgd_idx != -1);
return out::got->shdr.sh_addr + gotgd_idx * GOT_SIZE;
inline u64 Symbol::get_tlsgd_addr() const {
assert(tlsgd_idx != -1);
return out::got->shdr.sh_addr + tlsgd_idx * GOT_SIZE;
}
inline u64 Symbol::get_gotld_addr() const {
assert(gotld_idx != -1);
return out::got->shdr.sh_addr + gotld_idx * GOT_SIZE;
inline u64 Symbol::get_tlsld_addr() const {
assert(tlsld_idx != -1);
return out::got->shdr.sh_addr + tlsld_idx * GOT_SIZE;
}
inline u64 Symbol::get_plt_addr() const {

View File

@ -395,6 +395,18 @@ void GotSection::add_gottp_symbol(Symbol *sym) {
gottp_syms.push_back(sym);
}
void GotSection::add_tlsgd_symbol(Symbol *sym) {
sym->tlsgd_idx = shdr.sh_size / GOT_SIZE;
shdr.sh_size += GOT_SIZE * 2;
tlsgd_syms.push_back(sym);
}
void GotSection::add_tlsld_symbol(Symbol *sym) {
sym->tlsld_idx = shdr.sh_size / GOT_SIZE;
shdr.sh_size += GOT_SIZE;
tlsld_syms.push_back(sym);
}
void GotSection::copy_buf() {
u64 *buf = (u64 *)(out::buf + shdr.sh_offset);
memset(buf, 0, shdr.sh_size);