mirror of
https://github.com/ziglang/zig.git
synced 2026-01-12 02:15:12 +00:00
elf: make GOT arch aware when resolving relocs
This commit is contained in:
parent
775a161794
commit
60a8f9b989
@ -5550,6 +5550,15 @@ pub fn comdatGroupOwner(self: *Elf, index: ComdatGroupOwner.Index) *ComdatGroupO
|
||||
return &self.comdat_groups_owners.items[index];
|
||||
}
|
||||
|
||||
pub fn gotAddress(self: *Elf) u64 {
|
||||
const shndx = blk: {
|
||||
if (self.getTarget().cpu.arch == .x86_64 and self.got_plt_section_index != null)
|
||||
break :blk self.got_plt_section_index.?;
|
||||
break :blk if (self.got_section_index) |shndx| shndx else null;
|
||||
};
|
||||
return if (shndx) |index| self.shdrs.items[index].sh_addr else 0;
|
||||
}
|
||||
|
||||
pub fn tpAddress(self: *Elf) u64 {
|
||||
const index = self.phdr_tls_index orelse return 0;
|
||||
const phdr = self.phdrs.items[index];
|
||||
|
||||
@ -731,15 +731,7 @@ pub fn resolveRelocsAlloc(self: Atom, elf_file: *Elf, code: []u8) RelocError!voi
|
||||
// Address of the target symbol - can be address of the symbol within an atom or address of PLT stub.
|
||||
const S = @as(i64, @intCast(target.address(.{}, elf_file)));
|
||||
// Address of the global offset table.
|
||||
const GOT = blk: {
|
||||
const shndx = if (elf_file.got_plt_section_index) |shndx|
|
||||
shndx
|
||||
else if (elf_file.got_section_index) |shndx|
|
||||
shndx
|
||||
else
|
||||
null;
|
||||
break :blk if (shndx) |index| @as(i64, @intCast(elf_file.shdrs.items[index].sh_addr)) else 0;
|
||||
};
|
||||
const GOT = @as(i64, @intCast(elf_file.gotAddress()));
|
||||
// Address of the .zig.got table entry if any.
|
||||
const ZIG_GOT = @as(i64, @intCast(target.zigGotAddress(elf_file)));
|
||||
// Relative offset to the start of the global offset table.
|
||||
@ -924,15 +916,7 @@ pub fn resolveRelocsNonAlloc(self: Atom, elf_file: *Elf, code: []u8, undefs: any
|
||||
// Address of the target symbol - can be address of the symbol within an atom or address of PLT stub.
|
||||
const S = @as(i64, @intCast(target.address(.{}, elf_file)));
|
||||
// Address of the global offset table.
|
||||
const GOT = blk: {
|
||||
const shndx = if (elf_file.got_plt_section_index) |shndx|
|
||||
shndx
|
||||
else if (elf_file.got_section_index) |shndx|
|
||||
shndx
|
||||
else
|
||||
null;
|
||||
break :blk if (shndx) |index| @as(i64, @intCast(elf_file.shdrs.items[index].sh_addr)) else 0;
|
||||
};
|
||||
const GOT = @as(i64, @intCast(elf_file.gotAddress()));
|
||||
// Address of the dynamic thread pointer.
|
||||
const DTP = @as(i64, @intCast(elf_file.dtpAddress()));
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user