Как связать объектный файл C с языком ассемблера объектный файл?

У меня возникли проблемы с связыванием 2 объектных файлов, один из которых был сгенерирован из исходного файла языка ассемблера, а другой - из исходного файла C.

Исходный код C:

//main2.c
extern int strlength(char *);
int main(){
    char * test = "hello";
    int num = strlength(test);
    return num;
}

Исходный код сборки:

#strlength.s
.include "Linux32.s"

.section .text
.globl strlength
.type strlength, @function
strlength:
 pushl %ebp
 movl %esp, %ebp
 movl $0, %ecx
 movl 8(%ebp), %edx
read_next_byte:
 movb (%edx), %al
 cmpb $END_OF_FILE, %al
 jle end
 incl %edx
 incl %ecx
 jmp read_next_byte
end:
 movl %ecx, %eax
 popl %ebp
 ret

Когда я компилирую и запускаю с помощью gcc следующим образом:

gcc main2.c strlength.s -m32 -o test
./test
echo $?

Я получаю 5, что правильно. Однако, когда я компилирую / собираю отдельно, а затем связываю с 'ld' вот так:

as strlength.s --32 -o strlength.o
cc main2.c -m32 -o main2.o
ld -melf_i386 -e main main2.o strlength.o -o test
./test

Я получаю ошибку сегментации. Чем это вызвано? Я не на 100% соблюдаю соглашение о вызовах C?

10
задан Hudson Worden 31 December 2011 в 23:57
поделиться