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

lubuntu在NixOS上看不到ocamlopt生成的可执行文件,ocaml,x86-64,executable,nixos,Ocaml,X86 64,Executable,Nixos,我使用带有选项-linkall的“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

我使用带有选项-linkall的“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
我做错了什么?在尼克松,在奥卡姆,在卢本图

提前Tnx

UDP:my 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:

当试图执行确实存在的文件时,“没有这样的文件或目录”(
enoint
)通常意味着其动态链接器路径(ELF解释器)不存在。这与执行以
#开头的文本文件时发生的错误完全相同/不存在/路径

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

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

/bin/ls:ELF 64位LSB pie可执行文件,x86-64,版本1(SYSV), 动态链接,解释器/lib64/ld-linux-x86-64.so.2, BuildID[sha1]=4fef2dc9762eb7d4593f402a65cc02bb3d4c48de,用于GNU/Linux 3.2.0,剥离

大概是NixOS,或者至少是NixOS上的
ocamlopt
,使用了不同的路径。使用
文件
进行检查。(或
readelf-a
显示ELF程序头也将转储解释器路径。)

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

尝试执行确实存在的文件时,“没有这样的文件或目录”(
enoint
)通常意味着其动态链接器路径(ELF解释器)不存在。这与执行以
#开头的文本文件时发生的错误完全相同/不存在/路径

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

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

/bin/ls:ELF 64位LSB pie可执行文件,x86-64,版本1(SYSV), 动态链接,解释器/lib64/ld-linux-x86-64.so.2, BuildID[sha1]=4fef2dc9762eb7d4593f402a65cc02bb3d4c48de,用于GNU/Linux 3.2.0,剥离

大概是NixOS,或者至少是NixOS上的
ocamlopt
,使用了不同的路径。使用
文件
进行检查。(或
readelf-a
显示ELF程序头也将转储解释器路径。)


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

@Ston17:好了,你刚刚确认了答案。Ubuntu没有
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2
。如果你想的话,你可以把它创建成一个符号链接。@Ston17:你能在Ubuntu上构建它并在NixOS上运行吗?我猜一个不知名的发行版可能能够运行标准的二进制文件。至于在尼克松的基础上建设,我不知道,我从来没有听说过。你可以用符号链接设置你的Ubuntu系统,比如
ln-s//nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27
,这样它就可以运行NixOS二进制文件。我知道了,但这是不现实的。我不能在目标系统上创建任何东西-让我们假设这台计算机不是我的。我可以强制ocamlopt编译器静态链接systemlib吗?tnxif我将把ld-linux-x86-64.so.2和我的a.out可执行文件放在文件夹中-会有帮助吗?tnx@Ston17:我不知道是否/如何使用NixOS创建具有正常路径的可执行文件。我对OCaml也一无所知。你可以把这当作一个新问题来问;一定要给它贴上标签。@Ston17:好了,你刚刚确认了这就是答案。Ubuntu没有
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2
。如果你想的话,你可以把它创建成一个符号链接。@Ston17:你能在Ubuntu上构建它并在NixOS上运行吗?我猜一个不知名的发行版可能能够运行标准的二进制文件。至于在尼克松的基础上建设,我不知道,我从来没有听说过。你可以用符号链接设置你的Ubuntu系统,比如
ln-s//nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27
,这样它就可以运行NixOS二进制文件。我知道了,但这是不现实的。我不能在目标系统上创建任何东西-让我们假设这台计算机不是我的。我可以强制ocamlopt编译器静态链接systemlib吗?tnxif我将把ld-linux-x86-64.so.2和我的a.out可执行文件放在文件夹中-会有帮助吗?tnx@Ston17:我不知道是否/如何使用NixOS创建具有正常路径的可执行文件。我对OCaml也一无所知。你可以把这当作一个新问题来问;一定要给它贴上标签。
$> readelf -a a.out | grep ld-
      [Requesting program interpreter: /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2]