Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 链接多个程序集文件_Linux_Assembly - Fatal编程技术网

Linux 链接多个程序集文件

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

我试图将程序集主文件链接到外部函数,但我一直得到“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 `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调用这些函数并使用。。