Tôi gặp sự cố khi liên kết 2 tệp đối tượng trong đó một tệp được tạo từ Tệp nguồn ngôn ngữ hội và tệp khác được tạo từ tệp nguồn C.Làm thế nào để liên kết tệp đối tượng C với tệp đối tượng Ngôn ngữ hội?
C mã nguồn:
//main2.c
extern int strlength(char *);
int main(){
char * test = "hello";
int num = strlength(test);
return num;
}
mã nguồn hội:
#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
Khi tôi biên dịch và chạy bằng 'gcc' như thế này:
gcc main2.c strlength.s -m32 -o test
./test
echo $?
tôi nhận được 5 tương đương với chính xác. Tuy nhiên khi tôi biên dịch/lắp ráp riêng biệt và sau đó liên kết với 'ld' như thế này:
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
tôi nhận được một lỗi segmentation. Điều gì gây ra điều này? Tôi có không tuân thủ quy ước gọi điện 100% chính xác không?