linux运行c程序a. out,bash:./a.out:在由ld生成的运行可执行文件上没有这样的文件或目录。...
小編典典
其他答案僅涉及如何避免這種情況,而不是 實際發生的問題 。
gcc -c a.c; ld -lc a.o您提供的命令會產生非常明顯的警告:
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400260
因此,即使可以執行該文件,它也可能立即崩潰。 請參閱@EmployedRussian的答案 ,以獲取有關應該執行的操作的說明。
為什么甚至無法執行該問題仍然很有趣:
$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 72 vars */]) = -1 ENOENT (No such file or directory)
execve(2)返回ENOENT,因為它找不到解釋器(我從中找出了解釋器file,依此類推,請參見下文)。從嘗試運行以開頭的文件時,您會得到相同的錯誤
#!/usr/non-existant-path/bin/bash
如您所發現,此錯誤消息的通常原因是在沒有安裝正確的動態鏈接器和動態庫的系統(例如,未安裝32位支持的64位系統)上運行ELF二進制文件時。在您的情況下,這是因為您使用了錯誤的鏈接命令,并使用錯誤的解釋器路徑制作了動態可執行文件。
我在Ubuntu 15.10上,其中GNU file版本5.22報告:
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld64.so.1, not stripped
/lib/ld64.so.1我的系統上沒有。 ldd輸出令人困惑,因為ldd使用其默認的ELF解釋程序,而不是二進制文件指定的解釋程序。
$ ldd a.out
linux-vdso.so.1 => (0x00007ffc18d2b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0e0a79f000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x0000559dbc9d2000)
因此ldd,我猜它假設二進制文件中的運行時解釋器已解析為使用過的解釋器。
您的ldd輸出可能也來自舊版本,因為它僅顯示/lib64/ld-
linux-x86-64.so.2該行。對于像這樣的怪異情況,最好不要做出錯誤的猜測,但是這并不能幫助您看到二進制文件具有奇怪的解釋器路徑。
readelf -l a.out
將為您解碼ELF標頭,包括解釋器路徑。(感謝@EmployedRussian的評論指出了這一點。)
2020-06-07
總結
以上是生活随笔為你收集整理的linux运行c程序a. out,bash:./a.out:在由ld生成的运行可执行文件上没有这样的文件或目录。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux tomcat 清空war,L
- 下一篇: linux内核匹配的编译器gcc,lin