Fix logic for detecting _DYNAMIC symbol
Prevent spurious crashes for non-PIE executables.master
parent
c7170e4a54
commit
560043dadf
|
@ -59,24 +59,12 @@ const RDebug = extern struct {
|
|||
r_ldbase: usize,
|
||||
};
|
||||
|
||||
// TODO: This should be weak (#1917)
|
||||
extern var _DYNAMIC: [128]elf.Dyn;
|
||||
|
||||
comptime {
|
||||
if (std.Target.current.os.tag == .linux) {
|
||||
asm (
|
||||
\\ .weak _DYNAMIC
|
||||
\\ .hidden _DYNAMIC
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn linkmap_iterator(phdrs: []elf.Phdr) !LinkMap.Iterator {
|
||||
if (@ptrToInt(&_DYNAMIC[0]) == 0) {
|
||||
const _DYNAMIC = @extern([*]elf.Dyn, .{ .name = "_DYNAMIC", .linkage = .Weak }) orelse {
|
||||
// No PT_DYNAMIC means this is either a statically-linked program or a
|
||||
// badly corrupted one
|
||||
// badly corrupted dynamically-linked one.
|
||||
return LinkMap.Iterator{ .current = null };
|
||||
}
|
||||
};
|
||||
|
||||
const link_map_ptr = init: {
|
||||
var i: usize = 0;
|
||||
|
|
|
@ -686,6 +686,8 @@ pub fn getBaseAddress() usize {
|
|||
if (base != 0) {
|
||||
return base;
|
||||
}
|
||||
// XXX: Wrong for PIE executables, it should look at the difference
|
||||
// between _DYNAMIC and the PT_DYNAMIC phdr instead.
|
||||
const phdr = os.system.getauxval(std.elf.AT_PHDR);
|
||||
return phdr - @sizeOf(std.elf.Ehdr);
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue