You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

root下gcc编译文件无执行权限 加权限后报Exec format错误

问题原因及解决方案

1. .o文件执行报Exec format error的原因

.o是编译过程产生的目标文件,仅包含单个源文件对应的未重定位机器码,缺少链接阶段补充的程序入口、库依赖绑定、运行时元数据等必要结构,本身就不属于操作系统可识别的可执行文件格式,和是否加执行权限无关。
你最初的问题根源是Makefile逻辑错误:把最终生成的可执行文件命名为.o后缀,同时规则写反导致生成的.o后缀文件本质还是目标文件,当然无法执行。

2. 去掉.o后缀后仍无执行权限、报Permission denied的原因

你仅修改了可执行文件的命名后缀,没有同步修正Makefile的规则:原有Makefile中链接可执行文件的规则目标为%.o,不带后缀的可执行文件名无法匹配到链接规则,只会匹配到编译目标文件的规则,gcc加-c参数编译目标文件时默认不会添加执行权限,生成的文件本质还是目标文件,自然无法运行。

修复方案

第一步:修正Makefile内容如下

CC=gcc
CFLAGS=-g -Wall
OBJS=shared_memory.o
# 可执行文件不要带.o后缀
EXE=writeshmem readshmem destroy_shmem

all: $(EXE)

# 链接规则:匹配不带后缀的可执行文件目标,完成链接生成可执行程序
%: %.o $(OBJS)
    $(CC) $(CFLAGS) $^ -o $@

# 编译规则:仅生成目标文件
%.o: %.c %.h
    $(CC) $(CFLAGS) -c $< -o $@

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -f *.o $(EXE)

第二步:重新编译运行

执行以下命令:

# 清空历史错误生成文件
make clean
# 重新编译
make
# 运行程序
./writeshmem

特殊情况排查

如果修正后生成的可执行文件仍无执行权限,排查当前目录是否为虚拟机和宿主机的共享目录:多数共享目录默认挂载时会加noexec参数,禁止分区内所有文件执行,这种情况把代码复制到本地非共享目录(如/home/fawad)重新编译即可。


内容的提问来源于stack exchange,提问作者user786

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:42:02