mirror of
https://github.com/rui314/mold.git
synced 2024-09-22 02:20:51 +03:00
wip
This commit is contained in:
parent
7b5e459b35
commit
e55c74405f
@ -148,7 +148,7 @@ void InputSection<I386>::apply_reloc_alloc(Context<I386> &ctx, u8 *base) {
|
||||
u8 *loc = base + rel.r_offset;
|
||||
|
||||
const SectionFragmentRef<I386> *ref = nullptr;
|
||||
if (frag_idx < rel_fragments.size() && rel_fragments[frag_idx].idx == i)
|
||||
if (rel_fragments && rel_fragments[frag_idx].idx == i)
|
||||
ref = &rel_fragments[frag_idx++];
|
||||
|
||||
auto write = [&](u64 val) {
|
||||
@ -227,7 +227,7 @@ void InputSection<I386>::apply_reloc_nonalloc(Context<I386> &ctx, u8 *base) {
|
||||
}
|
||||
|
||||
const SectionFragmentRef<I386> *ref = nullptr;
|
||||
if (frag_idx < rel_fragments.size() && rel_fragments[frag_idx].idx == i)
|
||||
if (rel_fragments && rel_fragments[frag_idx].idx == i)
|
||||
ref = &rel_fragments[frag_idx++];
|
||||
|
||||
auto write = [&](u64 val) {
|
||||
|
@ -256,7 +256,7 @@ void InputSection<X86_64>::apply_reloc_alloc(Context<X86_64> &ctx, u8 *base) {
|
||||
u8 *loc = base + rel.r_offset;
|
||||
|
||||
const SectionFragmentRef<X86_64> *ref = nullptr;
|
||||
if (frag_idx < rel_fragments.size() && rel_fragments[frag_idx].idx == i)
|
||||
if (rel_fragments && rel_fragments[frag_idx].idx == i)
|
||||
ref = &rel_fragments[frag_idx++];
|
||||
|
||||
auto write = [&](u64 val) {
|
||||
@ -415,7 +415,7 @@ void InputSection<X86_64>::apply_reloc_nonalloc(Context<X86_64> &ctx, u8 *base)
|
||||
}
|
||||
|
||||
const SectionFragmentRef<X86_64> *ref = nullptr;
|
||||
if (frag_idx < rel_fragments.size() && rel_fragments[frag_idx].idx == i)
|
||||
if (rel_fragments && rel_fragments[frag_idx].idx == i)
|
||||
ref = &rel_fragments[frag_idx++];
|
||||
|
||||
auto write = [&](u64 val) {
|
||||
|
@ -34,8 +34,9 @@ static void visit(Context<E> &ctx, InputSection<E> *isec,
|
||||
// A relocation can refer either a section fragment (i.e. a piece of
|
||||
// string in a mergeable string section) or a symbol. Mark all
|
||||
// section fragments as alive.
|
||||
for (SectionFragmentRef<E> &ref : isec->rel_fragments)
|
||||
ref.frag->is_alive = true;
|
||||
if (isec->rel_fragments)
|
||||
for (i64 i = 0; isec->rel_fragments[i].idx >= 0; i++)
|
||||
isec->rel_fragments[i].frag->is_alive = true;
|
||||
|
||||
// If this is a text section, .eh_frame may contain records
|
||||
// describing how to handle exceptions for that function.
|
||||
|
9
icf.cc
9
icf.cc
@ -286,8 +286,7 @@ static Digest compute_digest(Context<E> &ctx, InputSection<E> &isec) {
|
||||
hash(rel.r_type);
|
||||
hash(isec.get_addend(rel));
|
||||
|
||||
if (frag_idx < isec.rel_fragments.size() &&
|
||||
isec.rel_fragments[frag_idx].idx == i) {
|
||||
if (isec.rel_fragments && isec.rel_fragments[frag_idx].idx == i) {
|
||||
SectionFragmentRef<E> &ref = isec.rel_fragments[frag_idx++];
|
||||
hash('a');
|
||||
isec.get_addend(rel);
|
||||
@ -363,8 +362,7 @@ static void gather_edges(Context<E> &ctx,
|
||||
i64 frag_idx = 0;
|
||||
|
||||
for (i64 j = 0; j < isec.get_rels(ctx).size(); j++) {
|
||||
if (frag_idx < isec.rel_fragments.size() &&
|
||||
isec.rel_fragments[frag_idx].idx == j) {
|
||||
if (isec.rel_fragments && isec.rel_fragments[frag_idx].idx == j) {
|
||||
frag_idx++;
|
||||
} else {
|
||||
ElfRel<E> &rel = isec.get_rels(ctx)[j];
|
||||
@ -386,8 +384,7 @@ static void gather_edges(Context<E> &ctx,
|
||||
i64 idx = edge_indices[i];
|
||||
|
||||
for (i64 j = 0; j < isec.get_rels(ctx).size(); j++) {
|
||||
if (frag_idx < isec.rel_fragments.size() &&
|
||||
isec.rel_fragments[frag_idx].idx == j) {
|
||||
if (isec.rel_fragments && isec.rel_fragments[frag_idx].idx == j) {
|
||||
frag_idx++;
|
||||
ElfRel<E> &rel = isec.get_rels(ctx)[j];
|
||||
Symbol<E> &sym = *isec.file.symbols[rel.r_sym];
|
||||
|
2
mold.h
2
mold.h
@ -256,7 +256,7 @@ public:
|
||||
std::string_view name;
|
||||
std::string_view contents;
|
||||
|
||||
std::vector<SectionFragmentRef<E>> rel_fragments;
|
||||
std::unique_ptr<SectionFragmentRef<E>[]> rel_fragments;
|
||||
std::unique_ptr<u8[]> rel_types;
|
||||
std::span<FdeRecord<E>> fdes;
|
||||
|
||||
|
@ -584,6 +584,25 @@ void ObjectFile<E>::initialize_mergeable_sections(Context<E> &ctx) {
|
||||
if (rels.empty())
|
||||
continue;
|
||||
|
||||
i64 len = 0;
|
||||
|
||||
for (i64 i = 0; i < rels.size(); i++) {
|
||||
const ElfRel<E> &rel = rels[i];
|
||||
const ElfSym<E> &esym = elf_syms[rel.r_sym];
|
||||
|
||||
if (esym.st_type == STT_SECTION) {
|
||||
MergeableSection<E> &m = mergeable_sections[get_shndx(esym)];
|
||||
if (!m.fragments.empty())
|
||||
len++;
|
||||
}
|
||||
}
|
||||
|
||||
if (len == 0)
|
||||
continue;
|
||||
|
||||
isec->rel_fragments.reset(new SectionFragmentRef<E>[len + 1]);
|
||||
i64 frag_idx = 0;
|
||||
|
||||
for (i64 i = 0; i < rels.size(); i++) {
|
||||
const ElfRel<E> &rel = rels[i];
|
||||
const ElfSym<E> &esym = elf_syms[rel.r_sym];
|
||||
@ -602,10 +621,11 @@ void ObjectFile<E>::initialize_mergeable_sections(Context<E> &ctx) {
|
||||
Fatal(ctx) << *this << ": bad relocation at " << rel.r_sym;
|
||||
i64 idx = it - 1 - offsets.begin();
|
||||
|
||||
SectionFragmentRef<E> ref{m.fragments[idx], (i32)i,
|
||||
(i32)(offset - offsets[idx])};
|
||||
isec->rel_fragments.push_back(ref);
|
||||
isec->rel_fragments[frag_idx++] = {m.fragments[idx], (i32)i,
|
||||
(i32)(offset - offsets[idx])};
|
||||
}
|
||||
|
||||
isec->rel_fragments[frag_idx++] = {nullptr, -1, -1};
|
||||
}
|
||||
|
||||
// Initialize sym_fragments
|
||||
|
Loading…
Reference in New Issue
Block a user