2016-09-19 71 views
1

当我想运行一个源代码,为什么这个工程:为什么我不能运行一个目标文件?

gcc test.c -o test.o 

然后

./test.o 

但这不起作用:

gcc -c test.c 

然后

./test.o 

和得到这个消息

bash: ./test.o: Permission denied 
+0

的对象文件不是机器指令。它并不打算运行。它旨在被链接。你应该使用'gcc test.c -o test'。然后你有一个名为'test'的可运行文件。 –

+0

好好看看了'男人ld',看看它是服务于创建最终ELF可执行的目的是什么,看到了答案(以及勒夫的删除一个)以下。在'gcc test.c -o test.o'之后的 –

+4

,您创建了名为'test.o'的可执行文件。它不是一个目标文件。 –

回答

5

首先,你是不是创建一个对象文件,但一个可执行文件。对象文件是用作链接器创建可执行文件的输入文件的中间文件。你用.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 
1

在第一种情况下,你只是生成的文件test.o使用-o,它已编制汇编和链接。

在第二种情况下,你只是编译和汇编,它不能没有链接运行。为-cgcc --hOverall options for gcc

-c

编译或汇编源文件,但不链接连接阶段根本没有完成。最终的输出是以每个源文件的目标文件的形式。 默认情况下,源文件的目标文件名是通过用'.o'替换后缀'.c','.i','.s'等来完成的。

Unrecognized input files, not requiring compilation or assembly, are ignored. 

(重点煤矿)

您需要链接,然后执行它:

gcc -o a.out test.o 
3

你得到消息,因为编译器没有按”在目标文件上设置可执行位,因为 - 因为它们不可执行。如果您手动设置可执行位并尝试运行它,您会得到类似“未知可执行文件格式”的内容。现在

,它不只是一个形式问题 - 问题是,对象文件只是一半的工作得到的东西,实际上可以被执行。特别是,它缺少连接工序,变成链接器找到未解决的引用,并从其他目标文件的地址补丁他们 - 包括你没有明确指定的,如标准库 - 并产生一个适当的可执行文件,内核知道如何加载和执行。

0

不能运行的目标文件。这不可执行,需要链接才能成为可执行文件。

尝试

gcc -o test test.c和使用./test.out

0

这是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 
相关问题