Проблема связывания файла Assembly (AT & T) с программой на C с помощью GCC - PullRequest
1 голос
/ 17 октября 2019

У меня есть моя C-программа в 'main.c' и функция list_equal () в 'list_equal.c'.

#include <stdlib.h>
#include "main.h"

int list_equal(const node_t *l1, const node_t *l2) {
    while (l1!=NULL && l2!=NULL) {
        if (l1->elem != l2->elem) return 0;
        l1 = l1->next;
        l2 = l2->next;
    }
    return l1==NULL && l2==NULL;
}

Когда я компилирую свою программу, используя:

$ gcc -m32 main.c list_equal.c -o main

все работало нормально, и я смог запустить мою программу ./main'.

Затем я перевел свою функцию в код ассемблера с использованием синтаксиса AT & T и назвал ее «list_equal.s». Вот код

.globl list_equal

list_equal:

movl 4(%esp),%eax
movl 8(%esp),%ecx

L:

testl %eax,%eax
jz E
testl %ecx,%ecx
jz E
movw (%ecx),%dx
cmpw %dx,(%eax)
je F
movl $0,%eax
ret

E:

testl %eax,%eax
setz %al
testl %ecx,%ecx
setz %ah
andb %ah,%al
movsbl %al,%eax
ret

F:

movl 4(%eax),%eax
movl 4(%ecx),%ecx
jmp L

Но когда я пытаюсь снова скомпилировать свою программу, на этот раз, используя сборку list_equal.s, с командой:

$gcc -m32 main.c list_equal.s -o main

Я получаю это сообщение об ошибке:

Undefined symbols for architecture i386:
  "_list_equal", referenced from:
      _test in main-bbda7f.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Заранее спасибо.

Информация о моем компиляторе gcc:

$ gcc --version
Configured with: --prefix=/Applications/Xcode_9.4.1.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.1.0 (clang-902.0.39.2)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Applications/Xcode_9.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

1 Ответ

1 голос
/ 17 октября 2019

Компилятор добавляет символ подчеркивания к имени функции.

Вы можете увидеть, что генерирует компилятор, если вы его так называете:

gcc -S -m32 list_equal.c -o list_equal.c.s

Без -m32 нетдополнительный символ.

...