Thank you for the detailed explanation! The RUNPATH method seems close to ideal.
I symlinked libcuda.so.1
to /run/opengl-driver/lib
and added the addOpenGLRunpath
hook to the postFixup
phase. After that, strace
showed that libcuda.so.1
is successfully located in /run/opengl-driver/lib
but another issue had emerged – now libnvidia-fatbinaryloader.so.418.67
was missing so i symlinked it to. It didn’t help though – libnvidia-fatbinaryloader
isn’t searched for in /run/opengl-driver/lib
.
Here’s the strace -f
:
execve("./result/bin/add", ["./result/bin/add"], 0x7fffe86e0138 /* 27 vars */) = 0
brk(NULL) = 0x10d7000
access("/etc/ld-nix.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/tls/haswell/avx512_1/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/tls/haswell/avx512_1/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/tls/haswell/avx512_1/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/tls/haswell/avx512_1", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/tls/haswell/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/tls/haswell/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/tls/haswell/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/tls/haswell", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/tls/avx512_1/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/tls/avx512_1/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/tls/avx512_1/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/tls/avx512_1", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/tls/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/tls/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/tls/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/tls", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/haswell/avx512_1/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/haswell/avx512_1/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/haswell/avx512_1/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/haswell/avx512_1", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/haswell/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/haswell/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/haswell/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/haswell", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/avx512_1/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/avx512_1/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/avx512_1/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/avx512_1", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/run/opengl-driver/lib/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/run/opengl-driver/lib", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/haswell/avx512_1/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/haswell/avx512_1/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/haswell/avx512_1/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/haswell/avx512_1", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/haswell/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/haswell/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/haswell/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/haswell", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/avx512_1/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/avx512_1/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/avx512_1/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/avx512_1", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/tls", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/haswell/avx512_1/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/haswell/avx512_1/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/haswell/avx512_1/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/haswell/avx512_1", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/haswell/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/haswell/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/haswell/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/haswell", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/avx512_1/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/avx512_1/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/avx512_1/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/avx512_1", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/x86_64/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/x86_64", 0x7fff8bc3be00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240#\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0555, st_size=45848, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f41b7015000
mmap(NULL, 39424, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f41b700b000
mmap(0x7f41b700d000, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f41b700d000
mmap(0x7f41b7011000, 8192, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f41b7011000
mmap(0x7f41b7013000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7f41b7013000
close(3) = 0
openat(AT_FDCWD, "/run/opengl-driver/lib/libpthread.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300k\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0555, st_size=146424, ...}) = 0
mmap(NULL, 131664, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f41b6fea000
mmap(0x7f41b6ff0000, 61440, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f41b6ff0000
mmap(0x7f41b6fff000, 24576, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15000) = 0x7f41b6fff000
mmap(0x7f41b7005000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a000) = 0x7f41b7005000
mmap(0x7f41b7007000, 12880, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f41b7007000
close(3) = 0
openat(AT_FDCWD, "/run/opengl-driver/lib/libdl.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \21\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0555, st_size=18520, ...}) = 0
mmap(NULL, 16528, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f41b6fe5000
mmap(0x7f41b6fe6000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7f41b6fe6000
mmap(0x7f41b6fe7000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f41b6fe7000
mmap(0x7f41b6fe8000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f41b6fe8000
close(3) = 0
openat(AT_FDCWD, "/run/opengl-driver/lib/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/haswell/avx512_1/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/haswell/avx512_1/x86_64", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/haswell/avx512_1/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/haswell/avx512_1", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/haswell/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/haswell/x86_64", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/haswell/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/haswell", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/avx512_1/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/avx512_1/x86_64", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/avx512_1/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/avx512_1", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/x86_64", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/tls", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/haswell/avx512_1/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/haswell/avx512_1/x86_64", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/haswell/avx512_1/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/haswell/avx512_1", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/haswell/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/haswell/x86_64", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/haswell/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/haswell", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/avx512_1/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/avx512_1/x86_64", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/avx512_1/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/avx512_1", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/x86_64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/x86_64", 0x7fff8bc3bd70) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240D\t\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0555, st_size=1595864, ...}) = 0
mmap(NULL, 1611296, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f41b6e5b000
mmap(0x7f41b6eec000, 708608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x91000) = 0x7f41b6eec000
mmap(0x7f41b6f99000, 245760, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13e000) = 0x7f41b6f99000
mmap(0x7f41b6fd5000, 53248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x179000) = 0x7f41b6fd5000
mmap(0x7f41b6fe2000, 9760, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f41b6fe2000
close(3) = 0
openat(AT_FDCWD, "/run/opengl-driver/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\302\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0555, st_size=1768144, ...}) = 0
mmap(NULL, 1658904, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f41b6cc5000
mmap(0x7f41b6cd1000, 733184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xc000) = 0x7f41b6cd1000
mmap(0x7f41b6d84000, 872448, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xbf000) = 0x7f41b6d84000
mmap(0x7f41b6e59000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x193000) = 0x7f41b6e59000
close(3) = 0
openat(AT_FDCWD, "/run/opengl-driver/lib/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20+\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0444, st_size=100608, ...}) = 0
mmap(NULL, 2185600, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f41b6aaf000
mprotect(0x7f41b6ac5000, 2093056, PROT_NONE) = 0
mmap(0x7f41b6cc4000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15000) = 0x7f41b6cc4000
close(3) = 0
openat(AT_FDCWD, "/run/opengl-driver/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260,\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0555, st_size=2015288, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f41b6aad000
mmap(NULL, 1792416, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f41b68f7000
mmap(0x7f41b6919000, 1298432, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f41b6919000
mmap(0x7f41b6a56000, 315392, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15f000) = 0x7f41b6a56000
mmap(0x7f41b6aa3000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ab000) = 0x7f41b6aa3000
mmap(0x7f41b6aa9000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f41b6aa9000
close(3) = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f41b68f4000
arch_prctl(ARCH_SET_FS, 0x7f41b68f4740) = 0
mprotect(0x7f41b6aa3000, 16384, PROT_READ) = 0
mprotect(0x7f41b6e59000, 4096, PROT_READ) = 0
mprotect(0x7f41b6fd5000, 49152, PROT_READ) = 0
mprotect(0x7f41b6fe8000, 4096, PROT_READ) = 0
mprotect(0x7f41b7005000, 4096, PROT_READ) = 0
mprotect(0x7f41b7013000, 4096, PROT_READ) = 0
mprotect(0x47e000, 12288, PROT_READ) = 0
mprotect(0x7f41b703d000, 4096, PROT_READ) = 0
set_tid_address(0x7f41b68f4a10) = 23254
set_robust_list(0x7f41b68f4a20, 24) = 0
rt_sigaction(SIGRTMIN, {sa_handler=0x7f41b6ff0640, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f41b6ffc860}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7f41b6ff06d0, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f41b6ffc860}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
brk(NULL) = 0x10d7000
brk(0x10f8000) = 0x10f8000
futex(0x7fff8bc3c67c, FUTEX_UNLOCK_PI) = -1 EPERM (Operation not permitted)
futex(0x481990, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7f41b6fe267c, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7f41b6fe2688, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7f41b6fe9048, FUTEX_WAKE_PRIVATE, 2147483647) = 0
openat(AT_FDCWD, "/run/opengl-driver/lib/libcuda.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\240\f\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=16142096, ...}) = 0
mmap(NULL, 18303816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f41b577f000
mprotect(0x7f41b656b000, 2093056, PROT_NONE) = 0
mmap(0x7f41b676a000, 1548288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xdeb000) = 0x7f41b676a000
mmap(0x7f41b68e4000, 64328, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f41b68e4000
close(3) = 0
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libnvidia-fatbinaryloader.so.418.67", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
munmap(0x7f41b577f000, 18303816) = 0
futex(0x482270, FUTEX_WAKE_PRIVATE, 2147483647) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x8bc3c888} ---
+++ killed by SIGSEGV (core dumped) +++
Debuging further
To debug further, i ran it with LD_LIBRARY_PATH
set to /run/opengl-driver/lib
:
LD_LIBRARY_PATH=/run/opengl-driver/lib/ ./result/bin/add
It worked – no crash. So we see that for some reason fatbinaryloader.so.418.67
isn’t searched for in RUNPATH but it is searched for in LD_LIBRARY_PATH
(i checked strace
, it’s found in /run/opengl-driver/lib/
as expected). Any idea why it’s acting like that?
Here’s readelf -d ./result/bin/add
output for good measure:
Dynamic section at offset 0x80890 contains 34 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [librt.so.1]
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000001d (RUNPATH) Library runpath: [/run/opengl-driver/lib:/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib:/nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib]
0x000000000000000c (INIT) 0x404000
0x000000000000000d (FINI) 0x466b00
0x0000000000000019 (INIT_ARRAY) 0x47e018
0x000000000000001b (INIT_ARRAYSZ) 160 (bytes)
0x000000000000001a (FINI_ARRAY) 0x47e0b8
0x000000000000001c (FINI_ARRAYSZ) 8 (bytes)
0x0000000000000004 (HASH) 0x400b40
0x000000006ffffef5 (GNU_HASH) 0x400b20
0x0000000000000005 (STRTAB) 0x3ff2e0
0x0000000000000006 (SYMTAB) 0x3ffc80
0x000000000000000a (STRSZ) 2461 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x480b00
0x0000000000000002 (PLTRELSZ) 3624 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x402238
0x0000000000000007 (RELA) 0x4021d8
0x0000000000000008 (RELASZ) 96 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000000000001e (FLAGS) BIND_NOW
0x000000006ffffffb (FLAGS_1) Flags: NOW
0x000000006ffffffe (VERNEED) 0x4020a8
0x000000006fffffff (VERNEEDNUM) 6
0x000000006ffffff0 (VERSYM) 0x401f6e
0x0000000000000000 (NULL) 0x0
(ldd
output stays essentially the same.)
Passing -l flags to nvcc
Next, i tried changing the nvcc
call to nvcc add.cu -lcuda -o add
. I do indeed get a better error message:
$ ./result/bin/add
./result/bin/add: error while loading shared libraries: libnvidia-fatbinaryloader.so.418.67: cannot open shared object file: No such file or directory
Here are ldd
outputs:
linux-vdso.so.1 (0x00007ffdc7d8a000)
libcuda.so.1 => /run/opengl-driver/lib/libcuda.so.1 (0x00007f5ed1da6000)
librt.so.1 => /nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/librt.so.1 (0x00007f5ed3136000)
libpthread.so.0 => /nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libpthread.so.0 (0x00007f5ed3115000)
libdl.so.2 => /nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libdl.so.2 (0x00007f5ed3110000)
libstdc++.so.6 => /nix/store/xg10ap5fki3slzy9lyy8xl6zksy51s8y-gcc-7.4.0-lib/lib/libstdc++.so.6 (0x00007f5ed2f86000)
libm.so.6 => /nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libm.so.6 (0x00007f5ed1c10000)
libgcc_s.so.1 => /nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libgcc_s.so.1 (0x00007f5ed19fa000)
libc.so.6 => /nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libc.so.6 (0x00007f5ed1844000)
libnvidia-fatbinaryloader.so.418.67 => /usr/lib/x86_64-linux-gnu/libnvidia-fatbinaryloader.so.418.67 (0x00007f5ed15f6000)
/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f5ed2f1b000)
libnvidia-fatbinaryloader.so.418.67
points to /usr/lib/x86_64-linux-gnu/
and it does exist at that location!
$ stat -t /usr/lib/x86_64-linux-gnu/libnvidia-fatbinaryloader.so.418.67
/usr/lib/x86_64-linux-gnu/libnvidia-fatbinaryloader.so.418.67 298696 584 81a4 0 0 10302 21241717 1 0 0 1572957060 1554536477 1563884453 0 4096
But when checking strace -f
i see that nothing’s changed – libnvidia-fatbinaryloader
is searched for in the nix store path for glibc
, same as before:
openat(AT_FDCWD, "/nix/store/6yaj6n8l925xxfbcd65gzqx3dz7idrnn-glibc-2.27/lib/libnvidia-fatbinaryloader.so.418.67", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
EDIT:
I noticed that libnvidia-fatbinaryloader
is pulled in by libcuda
:
$ ldd /run/opengl-driver/lib/libcuda.so.1
linux-vdso.so.1 (0x00007fffdbbed000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f73018d8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f73014e7000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f73012e3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f73010c4000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f7300ebc000)
libnvidia-fatbinaryloader.so.418.67 => /usr/lib/x86_64-linux-gnu/libnvidia-fatbinaryloader.so.418.67 (0x00007f7300c6e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7302deb000)
Does that explain why RPATH isn’t used when searching for it? Regardless, it still doesn’t explain why it isn’t searched for in /usr/lib/x86_64-linux-gnu/
as it’s suposed to.