新构建的 Ubuntu 可执行文件失败并显示 "Invalid argument"(退出代码 126)

freshly built Ubuntu executable fails with "Invalid argument" (exit code 126)

我已经在 Ubuntu 20.0.4 上编译并构建了一个 C++ 程序(使用 SDL2,以防万一),但是当我尝试 运行 它时,它只是打印“无效的论点”。如果我尝试通过 gdb 运行 它,它还会打印“无效参数”,然后是“在启动过程中程序以代码 126 退出”。 (这是在它遇到设置在 main 的断点之前)

我尝试过的事情:

ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=432e038be2c1180ec019b585ffbca182a80f6c55, for GNU/Linux 3.2.0, with debug_info, not stripped

我的 Makefile 非常简单,但它最终只用这个命令就完成了整个编译和 link 过程:

gcc -no-pie -o Build/soda src/*.cpp src/editline/complete.c src/editline/editline.c src/editline/sysunix.c src/MiniScript/*.cpp src/compiledData/*.c -Isrc -Isrc/editline -Isrc/MiniScript -Isrc/compiledData -lstdc++ -lm -lSDL2_image -lSDL2

除了我上面提到的 -no-pie(没有它,我得到相同的结果,但 file 认为它是一个共享库),我在这里看不到任何有趣的东西。

我没主意了。谷歌搜索“无效参数”效果不是很好,但我发现的一些相关点击表明它是任何执行文件失败的通用错误消息:错误的体系结构,错误的文件类型等。但是因为我真的只是在这台机器上构建它,很难看出它们如何应用。

我还能做些什么来确定导致此故障的原因?

我终于找到了答案。我在 Parallels 共享文件夹中工作,即来自主机 OS(在本例中为 macOS)的文件夹已作为驱动器安装在 Linux 文件系统(的Parallels 虚拟机)。

显然,运行从这样的共享文件夹中安装任何可执行文件根本行不通。将相同的可执行文件复制到我的 Linux 主目录,然后 运行 从那里安装它,工作正常。相反,如果我在我的 Linux 目录(它工作正常)中构建一个程序,然后将它复制到一个共享文件夹并尝试从那里 运行 它,我会收到“无效参数”错误。

非常感谢所有试图提供帮助的人,我希望 运行 遇到这个问题的下一个可怜的笨蛋能找到这个问题。