当我想运行一个源代码,为什么这个工程:为什么我不能运行一个目标文件?
gcc test.c -o test.o
然后
./test.o
但这不起作用:
gcc -c test.c
然后
./test.o
和得到这个消息
bash: ./test.o: Permission denied
当我想运行一个源代码,为什么这个工程:为什么我不能运行一个目标文件?
gcc test.c -o test.o
然后
./test.o
但这不起作用:
gcc -c test.c
然后
./test.o
和得到这个消息
bash: ./test.o: Permission denied
首先,你是不是创建一个对象文件,但一个可执行文件。对象文件是用作链接器创建可执行文件的输入文件的中间文件。你用.o
后缀命名它并不重要。
其次,由于传统,如果您没有使用-o
选项指定输出文件名,编译器前端程序和链接器将创建一个名为a.out
的可执行文件。
但这并非全部,因为第二个例子实际上是在创建一个真实的目标文件,而这些文件是不可执行的。就像上面提到的那样,那些需要传递给一个单独的链接步骤来创建可执行文件。
要么你需要创建一个可执行文件:
gcc test.c
./a.out
或者应该将目标文件链接成可执行文件:
gcc -c test.c # Create object file
gcc test.o -o test # Use object file to create executable file
./test # Run the executable file
在第一种情况下,你只是名生成的文件test.o
使用-o
,它已编制汇编和链接。
在第二种情况下,你只是编译和汇编,它不能没有链接运行。为-c
见gcc --h
或Overall options for gcc
:
-c
编译或汇编源文件,但不链接。 连接阶段根本没有完成。最终的输出是以每个源文件的目标文件的形式。 默认情况下,源文件的目标文件名是通过用'.o'替换后缀'.c','.i','.s'等来完成的。
Unrecognized input files, not requiring compilation or assembly, are ignored.
(重点煤矿)
您需要链接,然后执行它:
gcc -o a.out test.o
你得到消息,因为编译器没有按”在目标文件上设置可执行位,因为 - 因为它们不可执行。如果您手动设置可执行位并尝试运行它,您会得到类似“未知可执行文件格式”的内容。现在
,它不只是一个形式问题 - 问题是,对象文件只是一半的工作得到的东西,实际上可以被执行。特别是,它缺少连接工序,变成链接器找到未解决的引用,并从其他目标文件的地址补丁他们 - 包括你没有明确指定的,如标准库 - 并产生一个适当的可执行文件,内核知道如何加载和执行。
不能运行的目标文件。这不可执行,需要链接才能成为可执行文件。
尝试
gcc -o test test.c
和使用./test.out
这是gcc的一个根本性的问题上运行。需要注意的是从来没有使用-c参数,当你想在单个命令的可执行文件,例如
gcc -c xx.c yy.c -o new
。但你可以在下面的命令获取与-c可执行文件
gcc -c xx.c yy.c
gcc xx.o yy.o -o new
这相当于到
gcc xx.c yy.c -o new
的对象文件不是机器指令。它并不打算运行。它旨在被链接。你应该使用'gcc test.c -o test'。然后你有一个名为'test'的可运行文件。 –
好好看看了'男人ld',看看它是服务于创建最终ELF可执行的目的是什么,看到了答案(以及勒夫的删除一个)以下。在'gcc test.c -o test.o'之后的 –
,您创建了名为'test.o'的可执行文件。它不是一个目标文件。 –