Linux 链接多个程序集文件
我试图将程序集主文件链接到外部函数,但我一直得到“main中对函数X的未定义引用” 我有一个充满外部文件的文件夹,这些文件都是正确的名称和.s文件 我知道其他人也有这个问题,但他们似乎主要关注C和汇编文件,但这只是链接汇编文件 这是我编译时的代码:Linux 链接多个程序集文件,linux,assembly,Linux,Assembly,我试图将程序集主文件链接到外部函数,但我一直得到“main中对函数X的未定义引用” 我有一个充满外部文件的文件夹,这些文件都是正确的名称和.s文件 我知道其他人也有这个问题,但他们似乎主要关注C和汇编文件,但这只是链接汇编文件 这是我编译时的代码: gcc -o main.o main.s -I lib/ -no-pie 尝试编译时发生的错误: /tmp/ccMgNx1L.o: In function `main': (.text+0xa): undefined reference to `f
gcc -o main.o main.s -I lib/ -no-pie
尝试编译时发生的错误:
/tmp/ccMgNx1L.o: In function `main':
(.text+0xa): undefined reference to `funcA'
(.text+0xf): undefined reference to `funcB'
(.text+0x14): undefined reference to `funcC'
一些额外的澄清:
lib文件夹包含main.s文件中引用的所有函数。
我希望将所有文件编译成一个可执行文件。我认为您希望
gcc-no pie-o main.s lib/*.s
将所有源文件汇编成一个可执行文件
请注意,输出文件中缺少
.o
,因为您正在汇编+链接到一个可执行文件,而不仅仅是一个未链接的.o
对象文件
-I
设置#include
和#include”“
的包含路径。这完全不相干。-L lib/
也是如此,因为您没有告诉gcc链接任何库。只有在链接了任何库的情况下才可以在哪里查找库。(但您没有.a
或。因此
库中有尚未汇编的asm源文件。)
如果您有
main.S
(大写字母S),gcc将首先通过C预处理器运行它,因此您可以#在main中为实际使用的所有函数包含“foo.S”
。和-I
设置包含路径将避免需要#include“lib/foo.s”
如果要将源文件编译成目标文件,请将选项-c
传递到gcc
。否则,gcc将尝试链接。否则,请发一封邮件。我不太确定你认为会发生什么。我希望把这些文件编译成一个可执行的对象文件。没有可执行的对象文件。您有一个对象文件(未链接)或一个可执行文件(链接)。你想要这两个文件中的哪一个?一个可执行文件:pin-general(有一些罕见的例外,gnu不是一个)c被编译成汇编语言,然后组装成一个对象,然后链接成最终的二进制文件。因此,从工具的角度来看,使用gcc/gnu,您在C中所做的与在asm中所做的没有什么不同(您可以使用汇编程序而不是C编译器来汇编程序)。不同之处在于,如果您的汇编语言没有做您认为它相对于等效C程序所做的事情。请提供一个简单的例子,同时编写一个C程序main.C调用这些函数并使用。。