Ubuntu下执行make run生成的可执行文件报错execvp无效参数怎么解决
错误原因
- 头文件缺失:main.c中调用了
printf、scanf标准库函数,但没有引入<stdio.h>头文件,会导致函数隐式声明问题,编译生成的文件结构异常。 - 全局变量重复定义:C代码中已经定义了
op1、op2、res三个全局变量,汇编代码中又将这三个变量放入.data段声明,属于重复定义全局符号,链接后生成的main文件为无效可执行文件,系统无法正常加载运行,因此触发execvp: ./main: invalid argument报错,错误码127对应可执行文件无法加载的场景。 - 可选项排查:如果Makefile中各目标下的命令行没有用TAB缩进(而是用空格代替),也会导致编译流程异常,生成无效可执行文件。
修复步骤
- 修改main.c,在文件顶部添加标准输入输出头文件引用:
#include <stdio.h> #include "asm.h" int op1 = 0, op2 = 0, res = 0; int main() { printf("Valor op1:"); scanf("%d", &op1); printf("Valor op2:"); scanf("%d", &op2); sum(); printf("sum = %d:0x%x\n", res, res); return 0; }
- 修改asm.s汇编文件,移除.data段中重复的变量定义,改用
.extern声明三个全局变量来自外部文件:
.extern op1 .extern op2 .extern res .section .text .global sum # void sum(void) sum: movl op1(%rip), %ecx #place op1 in ecx movl op2(%rip), %eax #place op2 in eax addl %ecx, %eax #add ecx to eax. Result is in eax movl %eax, res(%rip) # copy the result to res ret
- 执行
make clean清理之前生成的错误目标文件和可执行文件,再执行make run即可正常运行。
内容的提问来源于stack exchange,提问作者Diogo
相关产品推荐
相关产品推荐

