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



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

我尝试过的事情:

  • 确认文件上设置了执行位。
  • 添加了-no-pie链接器标志,这使得它构建一个普通的ELF可执行文件,而不是一个可重定位的(见这里)。readelffile现在都同意它是可执行文件。file现在打印:

ELF 64位LSB可执行文件,x86-64,版本1 (SYSV),动态链接,interpreter/lib64/ld-linux-x86-64.so。2、builddid [sha1]=432e038be2c1180ec019b585ffbca182a80f6c55,适用于GNU/Linux 3.2.0,带debug_info,不剥离

  • 检查与ldd的库依赖关系。列出了几十个库,但似乎都成功找到了。
  • 尝试通过sudo执行它,以防它是一些奇怪的所有权/权限问题。

我的Makefile非常简单,但它最终完成了整个编译&用这条命令链接进程:

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共享文件夹中工作,即来自主机操作系统(在本例中为macOS)的文件夹,该文件夹已作为驱动器挂载在Linux文件系统(Parallels虚拟机)中。

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

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

相关内容