新编译的Ubuntu可执行文件报Invalid argument错误退出码126如何解决
排查方向
- 跟踪系统调用定位错误触发点
执行strace ./Build/soda,查看所有系统调用的返回值,定位哪个调用返回了EINVAL(对应"Invalid argument"报错),可直接定位是内核加载ELF阶段、动态链接阶段还是库初始化阶段出错。 - 查看动态链接加载详细日志
执行LD_DEBUG=all ./Build/soda 2>&1 | head -200,输出动态链接器的完整加载流程日志,检查是否是某个依赖库的初始化、符号解析步骤出错。 - 验证ELF解释器可用性
虽然file命令识别到解释器为/lib64/ld-linux-x86-64.so.2,仍需执行ls -l /lib64/ld-linux-x86-64.so.2确认该文件存在且软链接指向正确,没有损坏或架构不匹配问题。 - 检查挂载分区执行权限
若Build目录位于单独挂载的分区,执行mount查看对应分区的挂载参数,确认没有noexec标记(该标记会禁止分区内所有文件执行,哪怕文件本身有可执行权限)。 - 排除工具链链接规则问题
你当前用gcc编译混合C/C代码并手动链接libstdc,可尝试将编译命令替换为g++,去掉-lstdc++参数重新编译,避免gcc处理C++全局构造、runtime初始化时的异常。 - 最小示例复现排查
写一个仅包含空main函数的测试程序,使用完全相同的编译参数链接SDL2库,运行测试是否报错:
若测试程序同样报错,说明是本地SDL2安装、工具链或系统环境问题;若测试程序正常运行,则说明是原项目的全局对象构造、库构造函数逻辑存在问题。#include <SDL2/SDL.h> int main() { return 0; } - 检查ELF文件完整性
执行readelf -h Build/soda检查ELF头字段是否合法,执行size Build/soda查看程序段大小是否存在异常过大的情况。
内容的提问来源于stack exchange,提问作者Joe Strout
相关产品推荐
相关产品推荐

