zig-window icon indicating copy to clipboard operation
zig-window copied to clipboard

segfault on nixos linux + glibc

Open milahu opened this issue 2 years ago • 1 comments

this fails

https://github.com/andrewrk/zig-window/blob/313e3090b2eecdc5317291b5b13dc7871023d025/src/static-window.zig#L65-L67

wget https://andrewkelley.me/temp/static-window9

chmod +x static-window9

strace ./static-window9  # kids, dont do this at home. running untrusted binaries is bad
execve("./static-window9", ["./static-window9"], 0x7ffdbf62c110 /* 139 vars */) = 0
rt_sigaction(SIGSEGV, {sa_handler=0x25d130, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_RESETHAND|SA_SIGINFO, sa_restorer=0x234940}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGILL, {sa_handler=0x25d130, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_RESETHAND|SA_SIGINFO, sa_restorer=0x234940}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGBUS, {sa_handler=0x25d130, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_RESETHAND|SA_SIGINFO, sa_restorer=0x234940}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
write(2, "debug: detecting whether we are "..., 62debug: detecting whether we are running in the dynamic linker
) = 62
write(2, "debug: we're not. detecting the "..., 52debug: we're not. detecting the dynamic linker path
) = 52
uname({sysname="Linux", nodename="laptop1", ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbb8510c000
mmap(0x7fbb8510d000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbb8510d000
mmap(0x7fbb8510e000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbb8510e000
mmap(0x7fbb8510f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbb8510f000
openat(AT_FDCWD, "/usr/bin/env", O_RDONLY|O_NOCTTY|O_CLOEXEC) = 3
pread64(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\2\0>\0\1\0\0\0 \210@\0\0\0\0\0"..., 64, 0) = 64
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0@\0\0\0\0\0@\0@\0\0\0\0\0"..., 872, 64) = 872
pread64(3, "/nix/store/ayrsyv7npr0lcbann4k9l"..., 84, 792) = 84
pread64(3, "\1\0\0\0\0\0\0\0\34\r\0\0\0\0\0\0\1\0\0\0\0\0\0\0(\r\0\0\0\0\0\0"..., 248, 1680064) = 248
pread64(3, "\21\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0U\364\33\0\0\0\0\0"..., 1024, 1834296) = 64
pread64(3, "\0.symtab\0.strtab\0.shstrtab\0.inte"..., 4096, 1832021) = 2339
pread64(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1000, 1832312) = 1000
pread64(3, "\0__gmon_start__\0acl_get_fd\0acl_g"..., 4096, 11944) = 4096
openat(AT_FDCWD, "/nix/store/5h6q8cmqjd8iqpd99566hrg2a56pwdkc-acl-2.3.1/lib", O_RDONLY|O_CLOEXEC|O_PATH|O_DIRECTORY) = 4
readlinkat(4, "libc.so.6", 0x7ffc8f49ac40, 4096) = -1 ENOENT (No such file or directory)
close(4)                                = 0
openat(AT_FDCWD, "/nix/store/n239ln3v669s5fkir2fd8niqawyg6qrv-attr-2.5.1/lib", O_RDONLY|O_CLOEXEC|O_PATH|O_DIRECTORY) = 4
readlinkat(4, "libc.so.6", 0x7ffc8f49ac40, 4096) = -1 ENOENT (No such file or directory)
close(4)                                = 0
openat(AT_FDCWD, "/nix/store/ayrsyv7npr0lcbann4k9lxr19x813f0z-glibc-2.34-115/lib", O_RDONLY|O_CLOEXEC|O_PATH|O_DIRECTORY) = 4
readlinkat(4, "libc.so.6", 0x7ffc8f49ac40, 4096) = -1 EINVAL (Invalid argument)
rt_sigaction(SIGSEGV, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x234940}, {sa_handler=0x25d130, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_RESETHAND|SA_SIGINFO, sa_restorer=0x234940}, 8) = 0
rt_sigaction(SIGILL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x234940}, {sa_handler=0x25d130, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_RESETHAND|SA_SIGINFO, sa_restorer=0x234940}, 8) = 0
rt_sigaction(SIGBUS, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x234940}, {sa_handler=0x25d130, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_RESETHAND|SA_SIGINFO, sa_restorer=0x234940}, 8) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)

looks like it expects libc.so.6 to be a symlink?

stat /nix/store/ayrsyv7npr0lcbann4k9lxr19x813f0z-glibc-2.34-115/lib/libc.so.6 | head -n4
  File: /nix/store/ayrsyv7npr0lcbann4k9lxr19x813f0z-glibc-2.34-115/lib/libc.so.6
  Size: 2353088   	Blocks: 4600       IO Block: 4096   regular file
Device: 8,1	Inode: 29624799    Links: 1
Access: (0555/-r-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
readlink /nix/store/ayrsyv7npr0lcbann4k9lxr19x813f0z-glibc-2.34-115/lib/libc.so.6 || echo fail
fail
ldd /usr/bin/env | grep libc.so.6
	libc.so.6 => /nix/store/ayrsyv7npr0lcbann4k9lxr19x813f0z-glibc-2.34-115/lib/libc.so.6 (0x00007fa60e96d000)

milahu avatar May 20 '22 13:05 milahu

Can confirm I have the same issue on NixOS 22.05pre (glibc). I suspect this is just the out of date standard library used for the proof of concept, since the detection does work correctly on x86_64-0.10.0-dev.2351+b64a1d5ab (latest at the time of posting).

const std = @import("std");

pub fn main() anyerror!void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const info = try std.zig.system.NativeTargetInfo.detect(gpa.allocator(), .{});
    std.debug.print("found: {s}\n", .{info.dynamic_linker.buffer});
}
[viri@nixos:~/dev/tmp]$ zig run nativeinfo.zig 
found: /nix/store/bvy2z17rzlvkx2sj7fy99ajm853yv898-glibc-2.34-210/lib/ld-linux-x86-64.so.2

0x08088405 avatar May 24 '22 07:05 0x08088405