diff --git a/src/mold.h b/src/mold.h index cbac4d8b1b..7f2e241f34 100644 --- a/src/mold.h +++ b/src/mold.h @@ -477,7 +477,7 @@ enum AbsRelKind { template struct AbsRel { InputSection *isec = nullptr; - i64 offset = 0; + u64 offset = 0; Symbol *sym = nullptr; i64 addend = 0; AbsRelKind kind = ABS_REL_NONE; diff --git a/src/output-chunks.cc b/src/output-chunks.cc index 12bc1af8fc..3f994bb513 100644 --- a/src/output-chunks.cc +++ b/src/output-chunks.cc @@ -1100,8 +1100,8 @@ void OutputSection::scan_abs_relocations(Context &ctx) { InputSection *isec = members[i]; for (const ElfRel &r : isec->get_rels(ctx)) if (r.r_type == E::R_ABS) - shards[i].emplace_back(isec, r.r_offset, isec->file.symbols[r.r_sym], - get_addend(*isec, r)); + shards[i].push_back(AbsRel{isec, r.r_offset, isec->file.symbols[r.r_sym], + get_addend(*isec, r)}); }); abs_rels = flatten(shards); diff --git a/test/z-pack-relative-relocs.sh b/test/z-pack-relative-relocs.sh index b5e524ff5a..357bb859e2 100755 --- a/test/z-pack-relative-relocs.sh +++ b/test/z-pack-relative-relocs.sh @@ -9,6 +9,7 @@ int main() { EOF $CC -o $t/exe1 $t/a.o -pie -Wl,-z,pack-relative-relocs 2> /dev/null || skip +readelf -WS $t/exe1 | grep -Fq .relr.dyn || skip $QEMU $t/exe1 2> /dev/null | grep -q Hello || skip $CC -B. -o $t/exe2 $t/a.o -pie -Wl,-z,pack-relative-relocs