Commit 560043dadf

LemonBoy <thatlemon@gmail.com>
2020-11-23 12:00:12
Fix logic for detecting _DYNAMIC symbol
Prevent spurious crashes for non-PIE executables.
1 parent c7170e4
Changed files (2)
lib/std/dynamic_library.zig
@@ -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;
lib/std/process.zig
@@ -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);
         },