mirror of
https://github.com/rui314/mold.git
synced 2024-09-22 10:27:48 +03:00
wip
This commit is contained in:
parent
f3c66028b4
commit
9814405864
2
main.cc
2
main.cc
@ -398,8 +398,6 @@ static void scan_rels() {
|
||||
assert(sym->file->is_dso);
|
||||
|
||||
for (Symbol *alias : ((SharedFile *)sym->file)->find_aliases(sym)) {
|
||||
if (sym == alias)
|
||||
continue;
|
||||
alias->has_copyrel = true;
|
||||
alias->value = sym->value;
|
||||
out::dynsym->add_symbol(alias);
|
||||
|
2
mold.h
2
mold.h
@ -973,7 +973,7 @@ public:
|
||||
|
||||
void parse();
|
||||
void resolve_symbols();
|
||||
std::span<Symbol *> find_aliases(Symbol *sym);
|
||||
std::vector<Symbol *> find_aliases(Symbol *sym);
|
||||
|
||||
std::string_view soname;
|
||||
std::vector<std::string_view> version_strings;
|
||||
|
@ -873,36 +873,15 @@ void SharedFile::parse() {
|
||||
if (ElfShdr *sec = find_section(SHT_GNU_VERSYM))
|
||||
vers = get_data<u16>(*sec);
|
||||
|
||||
std::vector<std::pair<const ElfSym *, u16>> pairs;
|
||||
|
||||
for (i64 i = first_global; i < esyms.size(); i++) {
|
||||
if (!esyms[i].is_defined())
|
||||
continue;
|
||||
if (!vers.empty() && (vers[i] >> 15) == 1)
|
||||
continue;
|
||||
|
||||
if (vers.empty())
|
||||
pairs.push_back({&esyms[i], 1});
|
||||
else
|
||||
pairs.push_back({&esyms[i], vers[i]});
|
||||
}
|
||||
|
||||
// Sort symbols by value for find_aliases(), as find_aliases() does
|
||||
// binary search on symbols.
|
||||
sort(pairs, [](const std::pair<const ElfSym *, u16> &a,
|
||||
const std::pair<const ElfSym *, u16> &b) {
|
||||
return a.first->st_value < b.first->st_value;
|
||||
});
|
||||
|
||||
elf_syms.reserve(pairs.size());
|
||||
versyms.reserve(pairs.size());
|
||||
symbols.reserve(pairs.size());
|
||||
|
||||
for (std::pair<const ElfSym *, u16> &x : pairs) {
|
||||
elf_syms.push_back(x.first);
|
||||
versyms.push_back(x.second);
|
||||
|
||||
std::string_view name = symbol_strtab.data() + x.first->st_name;
|
||||
std::string_view name = symbol_strtab.data() + esyms[i].st_name;
|
||||
elf_syms.push_back(&esyms[i]);
|
||||
versyms.push_back(vers.empty() ? 1 : vers[i]);
|
||||
symbols.push_back(Symbol::intern(name));
|
||||
}
|
||||
|
||||
@ -965,10 +944,11 @@ void SharedFile::resolve_symbols() {
|
||||
}
|
||||
}
|
||||
|
||||
std::span<Symbol *> SharedFile::find_aliases(Symbol *sym) {
|
||||
std::vector<Symbol *> SharedFile::find_aliases(Symbol *sym) {
|
||||
assert(sym->file == this);
|
||||
auto [begin, end] = std::equal_range(
|
||||
symbols.begin(), symbols.end(), sym,
|
||||
[&](Symbol *a, Symbol *b) { return a->value < b->value; });
|
||||
return {begin, end};
|
||||
std::vector<Symbol *> vec;
|
||||
for (Symbol *sym2 : symbols)
|
||||
if (sym != sym2 && sym->value == sym2->value)
|
||||
vec.push_back(sym2);
|
||||
return vec;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user