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

标签 c++ linux ubuntu linker elf

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

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

  • 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


  • 使用 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 目录中构建一个程序(它可以正常工作),然后将其复制到共享文件夹并尝试从那里运行它,我会收到“无效参数”错误。
    非常感谢所有试图提供帮助的人,我希望遇到这个问题的下一个可怜的树液能找到这个问题。

    关于c++ - 新构建的 Ubuntu 可执行文件失败,出现 "Invalid argument"(退出代码 126),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69699589/

    相关文章:

    c++ - 处理 2+ 模板参数的最佳方法?

    c++ - 为什么 X(X&) 可以调用两次?

    linux - 如何删除目录中超过一天的所有文件/目录?

    linux - 在每个子目录中创建所有文件的 .txt

    c++ - 堆栈溢出 - 内存中的缓冲区位置

    c++ - std::string 与静态常量的 char 数组

    c++ - 在 C++ 中比较 char 以进行验证

    文件中的 Python 日志输出

    linux - 使用 C++ 在 Linux 中从 USB 摄像头捕获视频

    java - 如何在 ubuntu 16.04 上的 hadoop 中设置 JAVA_HOME 变量