1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-22 02:20:51 +03:00
This commit is contained in:
Rui Ueyama 2021-04-12 20:09:37 +09:00
parent 7b5e459b35
commit e55c74405f
6 changed files with 34 additions and 16 deletions

View File

@ -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) {

View File

@ -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) {

View File

@ -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
View File

@ -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
View File

@ -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;

View File

@ -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