I’m trying to figure out a bit of confusing behavior when linking. I made this project:
Due to its nature as a shared library, it’d be nice if it could be a statically linked shared library for maximum compatibility. There would be no need to create distro specific builds, as the project can already be built into a self contained folder, and run from there. However, using the muslc abi is a problem as in most contexts that vulkan icd loader libraries are loaded from will be gnu abi, preventing muslc unless I can somehow fully isolate all potential duplicate symbols from the loader process while still exposing gnu compatible external symbols for the few needed by the vulkan loader.
Luckily, by targeting a gnu abi from the jurassic era, this actually is achievable even with a mixed c/c++/zig project like Lurk.
$ zig build -Dcpu=baseline -Dtarget="x86_64-linux-gnu.2.0" -Doptimize=ReleaseSafe
$ ldd zig-out/lurk/lib/64/*
zig-out/lurk/lib/64/libopengl_layer_lurk.so:
statically linked
zig-out/lurk/lib/64/libvulkan_layer_lurk.so:
statically linked
Everything works as expected, with my admittedly limited sample size of 2 near identical arch linux systems. No symbols except those I intend to expose are visible, and a dynamic linker is unnecessary to load the libraries. Unfortunately, this only rings true for x86_64, and not x86.
$ zig build -Dcpu=baseline -Dtarget="x86-linux-gnu.2.0" -Doptimize=ReleaseSafe
$ ldd zig-out/lurk/lib/32/*
zig-out/lurk/lib/32/libopengl_layer_lurk.so:
linux-gate.so.1 (0xf7f69000)
libm.so.6 => /usr/lib32/libm.so.6 (0xf7e69000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e64000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7400000)
libdl.so.2 => /usr/lib32/libdl.so.2 (0xf7e5f000)
/usr/lib/ld-linux.so.2 (0xf7f6b000)
zig-out/lurk/lib/32/libvulkan_layer_lurk.so:
linux-gate.so.1 (0xf7ede000)
libm.so.6 => /usr/lib32/libm.so.6 (0xf7dde000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7dd9000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7400000)
libdl.so.2 => /usr/lib32/libdl.so.2 (0xf7dd4000)
/usr/lib/ld-linux.so.2 (0xf7ee0000)
x86 support is necessary for Lurk due to many windows games (especially legacy ones) being 32-bit and using 32-bit wine. Wine has WOW64 builds now, which enable running windows x86 binaries from wine builds compiled in 64-bit only mode, however this is likely not sufficient for Lurk’s needs. Many games (especially unpopular legacy games) will end up with scripts made by linux community members with pinned wine builds enabling game specific fixes, using projects such as lutris or bottles, with these scripts rarely to never receiving updates. Many users of such services lack the linux knowledge to properly troubleshoot and setup such an environment themselves, and expecting them to replace their wine release with a WOW64 build I believe to be unreasonable. They could instead compile Lurk on their machine to use their system linker like most programs, but I believe this is also unlikely to happen, and thus this wraps back around to supporting distro packages being time consuming.
I created a smaller example to isolate this behavior with the hope that I can find out why it happens. With a zig init-lib
project, adding one small c file:
// src/subtract.c
#include <stdio.h>
int subtract(int x, int y) {
int z = x - y;
printf("%d\n", z);
return z;
}
and a changing a few lines in the build.zig
to build a shared library with libc linked:
diff --git a/build.zig b/build.zig
index 8642679..98c16e0 100644
--- a/build.zig
+++ b/build.zig
@@ -15,7 +15,7 @@ pub fn build(b: *std.Build) void {
// set a preferred release mode, allowing the user to decide how to optimize.
const optimize = b.standardOptimizeOption(.{});
- const lib = b.addStaticLibrary(.{
+ const lib = b.addSharedLibrary(.{
.name = "temp",
// In this case the main source file is merely a path, however, in more
// complicated build scripts, this could be a generated file.
@@ -24,6 +24,14 @@ pub fn build(b: *std.Build) void {
.optimize = optimize,
});
+ if (target.getCpuArch() == .x86) {
+ // https://github.com/ziglang/zig/issues/7935#issuecomment-1258071152
+ lib.link_z_notext = true;
+ }
+
+ lib.linkLibC();
+ lib.addCSourceFile(.{ .file = .{ .path = "src/subtract.c" }, .flags = &.{} });
+
// This declares intent for the library to be installed into the standard
// location when the user invokes the "install" step (the default step when
// running `zig build`).
produces the following behaviors for x86_64:
for ((i=0; i<=38; i++)); do printf "gnu.2.$i\n" ; zig build -Dtarget=x86_64-linux-gnu.2."$i" ; ldd zig-out/lib/libtemp.so ; done
gnu.2.0
statically linked
gnu.2.1
statically linked
gnu.2.2
statically linked
gnu.2.3
linux-vdso.so.1 (0x00007ffed479f000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007ff773869000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007ff773687000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007ff773965000)
gnu.2.4
linux-vdso.so.1 (0x00007ffd0d5df000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f7518923000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f7518741000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f7518a1f000)
gnu.2.5
linux-vdso.so.1 (0x00007ffd067b2000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fbf2cc3c000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fbf2ca5a000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fbf2cd38000)
gnu.2.6
linux-vdso.so.1 (0x00007ffd33d4f000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f0e61d6b000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f0e61b89000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f0e61e67000)
gnu.2.7
linux-vdso.so.1 (0x00007ffd283e9000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fbb19965000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fbb19783000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fbb19a61000)
gnu.2.8
linux-vdso.so.1 (0x00007ffdc67b8000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fd87f539000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fd87f357000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fd87f635000)
gnu.2.9
linux-vdso.so.1 (0x00007fff13b68000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007ff8ce7bf000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007ff8ce5dd000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007ff8ce8bb000)
gnu.2.10
linux-vdso.so.1 (0x00007ffdfa7d3000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f4e59d9f000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f4e59bbd000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f4e59e9b000)
gnu.2.11
linux-vdso.so.1 (0x00007ffd797af000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f3b1a0b7000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f3b19ed5000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f3b1a1b3000)
gnu.2.12
linux-vdso.so.1 (0x00007ffe975d6000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f52f1b55000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f52f1973000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f52f1c51000)
gnu.2.13
linux-vdso.so.1 (0x00007ffd093cc000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f09884a4000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f09882c2000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f09885a0000)
gnu.2.14
linux-vdso.so.1 (0x00007fffa9b81000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f0aac8c5000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f0aac6e3000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f0aac9c1000)
gnu.2.15
linux-vdso.so.1 (0x00007ffc78b23000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fc7d2c64000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fc7d2a82000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fc7d2d60000)
gnu.2.16
linux-vdso.so.1 (0x00007fff575bd000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fdb3a41b000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fdb3a239000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fdb3a517000)
gnu.2.17
linux-vdso.so.1 (0x00007ffe3a870000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f7541754000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f7541572000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f7541850000)
gnu.2.18
linux-vdso.so.1 (0x00007ffe2233b000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f74de1a4000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f74ddfc2000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f74de2a0000)
gnu.2.19
linux-vdso.so.1 (0x00007ffeec662000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f5811ee7000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f5811d05000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f5811fe3000)
gnu.2.20
linux-vdso.so.1 (0x00007ffcfc4c5000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fa6874d6000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fa6872f4000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fa6875d2000)
gnu.2.21
linux-vdso.so.1 (0x00007ffe4e9ce000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fea69a51000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fea6986f000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fea69b4d000)
gnu.2.22
linux-vdso.so.1 (0x00007ffdf1360000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f6a006af000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f6a004cd000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f6a007ab000)
gnu.2.23
linux-vdso.so.1 (0x00007fffe6fdb000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fd9a9b6d000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fd9a998b000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fd9a9c69000)
gnu.2.24
linux-vdso.so.1 (0x00007ffd7ef43000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fe714e2c000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fe714c4a000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fe714f28000)
gnu.2.25
linux-vdso.so.1 (0x00007ffe96d25000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f47f8e3b000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f47f8c59000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f47f8f37000)
gnu.2.26
linux-vdso.so.1 (0x00007ffeaebe9000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f27a1dae000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f27a1bcc000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f27a1eaa000)
gnu.2.27
linux-vdso.so.1 (0x00007fff413e3000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fecad63e000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fecad45c000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fecad73a000)
gnu.2.28
linux-vdso.so.1 (0x00007ffedd593000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f68814f5000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f6881313000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f68815f1000)
gnu.2.29
linux-vdso.so.1 (0x00007ffd4d152000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fc190b3f000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fc19095d000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fc190c3b000)
gnu.2.30
linux-vdso.so.1 (0x00007ffdd38d9000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f097af0b000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f097ad29000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f097b007000)
gnu.2.31
linux-vdso.so.1 (0x00007ffd209fb000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f40395f2000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f4039410000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f40396ee000)
gnu.2.32
linux-vdso.so.1 (0x00007ffedc77b000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f1fe5024000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f1fe4e42000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f1fe5120000)
gnu.2.33
linux-vdso.so.1 (0x00007ffec79e4000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f0352924000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f0352742000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f0352a20000)
gnu.2.34
linux-vdso.so.1 (0x00007fff5b7a8000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fbb5d363000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fbb5d181000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fbb5d45f000)
gnu.2.35
linux-vdso.so.1 (0x00007ffc3e110000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f454bb23000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f454b941000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f454bc1f000)
gnu.2.36
linux-vdso.so.1 (0x00007fffe1796000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fd25e283000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fd25e0a1000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fd25e37f000)
gnu.2.37
linux-vdso.so.1 (0x00007ffe89de5000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f65ec9c3000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f65ec7e1000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f65ecabf000)
gnu.2.38
linux-vdso.so.1 (0x00007fffa9dc8000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f79c9b15000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f79c9933000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f79c9c11000)
and this behavior for x86:
for ((i=0; i<=38; i++)); do printf "gnu.2.$i\n" ; zig build -Dtarget=x86-linux-gnu.2."$i" ; ldd zig-out/lib/libtemp.so ; done
gnu.2.0
linux-gate.so.1 (0xf7f7b000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e72000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f7d000)
gnu.2.1
linux-gate.so.1 (0xf7f29000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e20000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7f2b000)
gnu.2.2
linux-gate.so.1 (0xf7f59000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e50000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f5b000)
gnu.2.3
linux-gate.so.1 (0xf7edd000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7dd4000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7edf000)
gnu.2.4
linux-gate.so.1 (0xf7ece000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7dc5000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7ed0000)
gnu.2.5
linux-gate.so.1 (0xf7ed9000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7dd0000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7edb000)
gnu.2.6
linux-gate.so.1 (0xf7fc3000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7eba000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7fc5000)
gnu.2.7
linux-gate.so.1 (0xf7f50000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e47000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f52000)
gnu.2.8
linux-gate.so.1 (0xf7efc000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7df3000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7efe000)
gnu.2.9
linux-gate.so.1 (0xf7f2f000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e26000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7f31000)
gnu.2.10
linux-gate.so.1 (0xf7fb7000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7eae000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7fb9000)
gnu.2.11
linux-gate.so.1 (0xf7f58000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e4f000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f5a000)
gnu.2.12
linux-gate.so.1 (0xf7f81000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e78000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f83000)
gnu.2.13
linux-gate.so.1 (0xf7f58000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e4f000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f5a000)
gnu.2.14
linux-gate.so.1 (0xf7fb0000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7ea7000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7fb2000)
gnu.2.15
linux-gate.so.1 (0xf7f1a000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e11000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7f1c000)
gnu.2.16
linux-gate.so.1 (0xf7f11000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e08000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7f13000)
gnu.2.17
linux-gate.so.1 (0xf7f46000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e3d000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f48000)
gnu.2.18
linux-gate.so.1 (0xf7eed000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7de4000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7eef000)
gnu.2.19
linux-gate.so.1 (0xf7fb7000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7eae000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7fb9000)
gnu.2.20
linux-gate.so.1 (0xf7f96000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e8d000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f98000)
gnu.2.21
linux-gate.so.1 (0xf7ee6000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7ddd000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7ee8000)
gnu.2.22
linux-gate.so.1 (0xf7ef3000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7dea000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7ef5000)
gnu.2.23
linux-gate.so.1 (0xf7f05000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7dfc000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7f07000)
gnu.2.24
linux-gate.so.1 (0xf7f48000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e3f000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f4a000)
gnu.2.25
linux-gate.so.1 (0xf7ecd000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7dc4000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7ecf000)
gnu.2.26
linux-gate.so.1 (0xf7ed7000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7dce000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7ed9000)
gnu.2.27
linux-gate.so.1 (0xf7f42000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e39000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f44000)
gnu.2.28
linux-gate.so.1 (0xf7f1e000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e15000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7f20000)
gnu.2.29
linux-gate.so.1 (0xf7f12000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e09000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7f14000)
gnu.2.30
linux-gate.so.1 (0xf7f98000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e8f000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f9a000)
gnu.2.31
linux-gate.so.1 (0xf7efe000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7df5000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7f00000)
gnu.2.32
linux-gate.so.1 (0xf7f0d000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e04000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7f0f000)
gnu.2.33
linux-gate.so.1 (0xf7ef2000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7dea000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7a00000)
/usr/lib/ld-linux.so.2 (0xf7ef4000)
gnu.2.34
linux-gate.so.1 (0xf7f9e000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e96000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7fa0000)
gnu.2.35
linux-gate.so.1 (0xf7f84000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e7c000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f86000)
gnu.2.36
linux-gate.so.1 (0xf7f6c000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e64000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f6e000)
gnu.2.37
linux-gate.so.1 (0xf7f47000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e3f000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7f49000)
gnu.2.38
linux-gate.so.1 (0xf7fb3000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7eab000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7c00000)
/usr/lib/ld-linux.so.2 (0xf7fb5000)
Based on the above, I believe one of the following make most sense:
- The x86 behavior is possibly incorrect. This would not surprise me as it is not a tier 1 target yet, see: Tier 1 Support for Linux i386 · Issue #1929 · ziglang/zig · GitHub . If true, it should be corrected to be more similar to the x86_64 result.
- The x86_64 behavior is possibly incorrect, and may have more subtle issues I haven’t yet experienced in Lurk. If true, it should be corrected to be more similar to the x86 result.
- Neither behavior is truly “correct”, and correctness will be achieved at some point in the future at the appropriate time to do so.
I unfortunately lack the expertise to even know where to begin looking for a path forward for any of these options, and my list is of course not exhaustive and limited based on my own experience. I’m willing to help in any way I can, so I thought I would post the information I have gathered so far here.