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 会失败。
我使用带有选项的“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 会失败。