lubuntu не видит исполняемый файл, созданный ocamlopt на NixOS - PullRequest
0 голосов
/ 28 мая 2020

Я создал исполняемый файл « standalone » в NixOS (x86_64), используя собственный компилятор « ocamlopt » с опцией -linkall. и сгенерированная программа выполняется в 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?

Tnx заранее

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]

1 Ответ

2 голосов
/ 28 мая 2020

«Нет такого файла или каталога» (ENOENT) при попытке выполнить файл, который существует, обычно означает, что его динамический c путь компоновщика (интерпретатор 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-битный LSB p ie исполняемый файл, x86-64, версия 1 (SYSV) , динамически подключаемый, интерпретатор /lib64/ld-linux-x86-64.so.2, BuildID [sha1] = 4fef2dc9762eb7d4593f402a65cc02bb3d4c48de, для GNU / Linux 3.2.0, без

Предположительно NixOS или, по крайней мере, ocamlopt на NixOS, использует другой путь. Для проверки введите file. (Или readelf -a, чтобы показать заголовки программы ELF, также сбросит путь интерпретатора.)

ldd также может показать путь интерпретатора, но IIR C не работает, если путь недействителен.

...