2011-07-19 37 views
6

Tôi đang cố gắng biên dịch một chương trình nhỏ trong hội đồng Linux trên kiến ​​trúc Intel. Tôi muốn sử dụng một số chức năng của thư viện C, nhưng nó không liên kết.Làm thế nào để gọi thư viện c từ mã lắp ráp trên Linux?

Đây là chương trình lắp ráp của tôi:

.text 
.globl main 

main: 
    pushl $512 
    call malloc 
    addl $4, %esp 

    mov $1, %eax 
    mov $0, %ebx 
    int $0x80 

Tôi đang biên soạn với

as --32 -o output.o output.asm 

đây, mọi thứ diễn ra tốt đẹp. Và sau đó khi tôi đang liên kết với

ld -static -m elf_i386 -o a.out output.o -lc 

, tôi đã nhận các lỗi này: /usr/lib32/libc.a(iofflush không xác định tham chiếu đến _Unwind_Resume' /usr/lib32/libc.a(iofclose.o):(.eh_frame+0x167): undefined reference to __gcc_personality_v0' :

(.text + 0x1b8) .o): Trong chức năng fflush': (.text+0xd7): undefined reference to _Unwind_Resume' /usr/lib32/libc.a(iofflush.o):(.eh_frame+0xdf): tài liệu tham khảo không xác định để __gcc_personality_v0' /usr/lib32/libc.a(iofputs.o): In function fputs': (.text + 0x108): tài liệu tham khảo không xác định để _Unwind_Resume' /usr/lib32/libc.a(iofputs.o):(.eh_frame+0xdf): undefined reference to __gcc_personality_v0 '/usr/lib32/libc.a(iofwrite.o): Trong hàm `fw nghi thức ':

(Tôi đã lỗi khác, nhưng nó là đủ để thấy vấn đề, tôi nghĩ)

tôi thấy một số giải pháp chỉ ra rằng tôi nên liên kết với -lgcc nhưng trên máy tính của tôi thư viện không tìm thấy ...

Có ai đó có ý tưởng không?

+3

Thử liên kết với gcc thay vì ld – Lyke

Trả lời

4

glibc yêu cầu mã khởi tạo nhất định phải được liên kết tĩnh với tệp thực thi. Cách dễ nhất để làm điều này là để liên kết sử dụng gcc:

gcc -static -o a.out output.o 

Bạn có thể thấy chính xác những gì đang được liên kết trong bằng cách thông qua -v-gcc là tốt.

+0

Nó hoạt động tốt. Cảm ơn bạn :) Tôi chỉ cần thêm tùy chọn -m32 để biên dịch trên máy 64 bit của tôi, nhưng điều đó thật tuyệt. –

+0

+1 cho tùy chọn -v. Cảm ơn bạn đã chỉ ra điều này - mới với tôi. – dwerner

1

Tôi thường để gcc làm việc thay vì sử dụng trực tiếp ld. Một khi bạn có đối tượng, chỉ gcc object.o -o executable

3

Tôi đã có cùng một vấn đề, vì vậy tôi đã làm

# gcc -static -o a.out hello.o -v 

đó đã cho tôi thông tin về những gì để bao gồm, sau đó tôi có thể liên kết sử dụng ld:

# ld -static -o hello -L`gcc -print-file-name=` /usr/lib/gcc/x86_64-linux-gnu/4.4.7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/../../../x86_64-linux-gnu/crti.o hello.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/../../../x86_64-linux-gnu/crtn.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/crtbeginT.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/crtend.o --start-group -lc -lgcc -lgcc_eh --end-group 
Các vấn đề liên quan