lubuntu 在 NixOS 上看不到 ocamlopt 生成的可执行文件

lubuntu does not see executable file generated by ocamlopt on NixOS

我使用带有选项的“ocamlopt”本机编译器在 NixOS (x86_64) 中创建了可执行文件“standalone” -链接器。生成的程序在 NixOS 中执行。到目前为止一切顺利

之后我尝试在 Lubuntu 下执行这个文件

lubuntu@lubuntu:~/Documents$ uname -a
Linux lubuntu 4.18.0-10-generic #11-Ubuntu SMP Thu Oct 11 15:13:55 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

但收到:

lubuntu@lubuntu:~/Documents$ ./a.out 
bash: ./a.out: No such file or directory

我很确定架构是合适的:

lubuntu@lubuntu:~/Documents$ objdump -h a.out

a.out:     file format elf64-x86-64

我做错了什么?在 NixOS、OCaml、Lubuntu 上?

提前发送

UDP:我的 NixOS 发行版:

$> uname -a
Linux cat 4.19.36 #1-NixOS SMP Sat Apr 20 07:16:05 UTC 2019 x86_64 GNU/Linux

ocaml:

$> ocamlopt -v                                                                                         
The OCaml native-code compiler, version 4.06.1   

UDP2:

$> readelf -a a.out | grep ld-
      [Requesting program interpreter: /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2]

"No such file or directory" (ENOENT) 当试图执行一个确实存在的文件时,通常意味着它的动态链接器路径(ELF 解释器)不存在。出于与执行以 #!/non-existant/path

开头的文本文件所得到的相同原因,这是完全相同的错误

使用 strace ./a.out 可以看到唯一的系统调用是失败的 execve

大多数 GNU/Linux 发行版使用 /lib64/ld-linux-x86-64.so.2。例如 file /bin/ls 在我的 Arch GNU/Linux 桌面上显示:

/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=4fef2dc9762eb7d4593f402a65cc02bb3d4c48de, for GNU/Linux 3.2.0, stripped

大概 NixOS,或者至少 ocamlopt 在 NixOS 上,使用不同的路径。使用 file 检查。 (或者 readelf -a 显示 ELF 程序头也会转储解释器路径。)

ldd 也可以显示解释器路径,但如果路径无效,IIRC 会失败。