【问题标题】:Can't link assembly and c无法链接程序集和 c
【发布时间】:2013-05-19 15:03:30
【问题描述】:

我在链接 c 和汇编代码时遇到问题。尝试搜索一些解决方案,但没有一个对我有用。

c 文件 "l3.c" 看起来像这样:

#include <stdio.h>
#include <stdlib.h>

const int INP_SIZE = 100;

extern int mult(int c1, int c2);

int main()
{
    char number[INP_SIZE];

    scanf("%s",number);
    printf("You typed: %s \n",number);

    int j=2;
    int k=5;
    j = mult(j,k); #here is the problem
    printf("%d",j);

    scanf("%s",number);
    return 0;
}

像这样组装“mult.s”:

.type mult, @function
mult:
push %rbp
mov %rsp, %rbp
mov 8(%rbp), %rbx
mov 12(%rbp), %rcx

mov $0, %rax
add %rbx, %rax;
add %rcx, %rax;

mov %rbp, %rsp
pop %rbp
ret

在我的 makefile 中,我得到了以下几行(我用谷歌搜索的最新解决方案):

l3:
    as -g -o mult.o mult.s
    gcc -o l3.o -c l3.c
    gcc l3.o mult.o

当我在控制台中输入 make 时,它​​会抛出:undefined reference to 'mult' 当我评论 //j = mult(j,k); 时,程序工作正常。我应该如何链接这个?

【问题讨论】:

    标签: c assembly linker


    【解决方案1】:

    您似乎没有将mult 导出为符号,因此链接器稍后找不到它。如何正确执行取决于您使用的汇编程序。由于您使用的是 AT&T 语法,我猜测 GNU 为 - 在这种情况下,只需在您的程序集文件顶部添加 .global mult

    【讨论】:

    • 很高兴听到它有帮助。您的函数被称为mult 有点奇怪,但似乎只是从堆栈中添加了两个值。他们如何到达那里?
    • 是的,它应该像add一样被调用。这背后有一个漫长而不有趣的故事......你的意思是这个价值观是如何到达那里的?嘿,我只是想弄清楚如何进入汇编,我在 c 中传递的参数。
    • 明白了。对于 64 位英特尔,根据我在此示例中看到的内容,它可能比您制作的更容易。查看此链接:en.wikipedia.org/wiki/…
    • 我刚刚阅读了其他文章。 “前六个参数进入 rdi、rsi、rdx、rcx、r8 和 r9。”呃...我以为他们在堆栈上。在我面前长跑。再次感谢你,你关心初学者程序员;)
    • @Kmaczek:在 UNIX 上的 32 位 x86 中,函数入口处的堆栈布局如下所示:EBP -&gt; [ caller EBP ] ret_addr arg[0] arg[1] arg[2] ...(如果使用了帧指针)。 调用约定 (ABI) 说,如果你想调用一个带参数的函数,在call 指令之前将它们压入堆栈[并在返回之后将它们弹出],这使得-8(%ebp)-12(%ebp) 函数的第一个和第二个参数。据我所知,此(32 位 x86 UNIX)的规范参考仍然是 sco.com/developers/devspecs/abi386-4.pdf
    猜你喜欢
    • 2015-07-07
    • 2020-08-01
    • 2018-08-12
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多