1

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

私のメイクファイルでは、次の行を取得しました(グーグルで検索した最新のソリューション):

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);プログラムは正常に動作します。これをどのようにリンクすればよいですか?

4

1 に答える 1

3

シンボルとしてエクスポートしていないように見えるmultため、リンカーは後でそれを見つけることができません。正しく行う方法は、使用しているアセンブラによって異なります。AT&T 構文を使用しているので、GNU を次のように推測します。その場合.global multは、アセンブリ ファイルの先頭に追加するだけです。

于 2013-05-19T15:35:49.873 に答える