Tôi đang học lắp ráp với NASM
cho một lớp tôi có ở trường đại học. Tôi muốn liên kết Thư viện Thời gian C C với ld
, nhưng tôi dường như không thể quấn đầu quanh nó. Tôi có một máy 64 bit
với cài đặt Linux Mint
.Làm thế nào để liên kết Thư viện C Runtime với 'ld'?
Lý do tôi nhầm lẫn là - với kiến thức của tôi - thay vì liên kết thời gian chạy C, gcc
sao chép những thứ bạn cần vào chương trình của mình. Mặc dù tôi có thể sai, vì vậy đừng ngần ngại sửa tôi bằng cách này, làm ơn.
Điều tôi đã làm cho đến thời điểm này là liên kết nó bằng cách sử dụng gcc
. Điều đó tạo ra một mớ hỗn độn của một mã máy mà tôi không thể làm theo mặc dù, ngay cả đối với một chương trình nhỏ như hoán đổi rax
với rbx
, điều đó không tuyệt vời cho mục đích học tập. (Xin lưu ý rằng chương trình hoạt động.)
Tôi không chắc chắn nếu nó có liên quan, nhưng đây là những lệnh mà chúng tôi đang sử dụng để biên dịch và liên kết:
# compilation
nasm -f elf64 swap.asm
# gcc
gcc -o swap swap.o
# ld, no c runtime
ld -s -o swap swap.o
Cảm ơn bạn trước!
Kết luận:
Bây giờ tôi có một câu trả lời đúng cho câu hỏi, sau đây là một vài điều mà tôi muốn đề cập đến. Liên kết glibc
động có thể được thực hiện như trong câu trả lời Z boson (đối với hệ thống 64 bit). Nếu bạn muốn làm điều đó tĩnh, do follow this link (tôi đang đăng lại từ Z boson 's câu trả lời).
Đây là một bài viết mà Jester đăng, về how programs start in linux.
Để xem nội dung gcc
liên kết số .o
-s của bạn, hãy dùng thử lệnh sau: gcc -v -o swap swap.o
. Lưu ý rằng 'v' là viết tắt của 'verbose'.
Ngoài ra, you should read this nếu bạn quan tâm đến việc lắp ráp 64 bit.
Cảm ơn bạn để có câu trả lời và thông tin chi tiết hữu ích! Kết thúc bài phát biểu.
Câu trả lời ngắn gọn: không. Thật không may libc đi kèm với không chỉ thư viện động, mà là một loạt các đối tượng tĩnh cần thiết để khởi tạo và tắt máy. Nếu bạn thực sự muốn làm điều đó, hãy sử dụng 'gcc -v' để xem những phần cần thiết là gì. Bạn có thể quan tâm đến [bài viết tuyệt vời này về việc khởi động chương trình] (http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html). – Jester
'gcc -o swap swap.o' liên kết thời gian chạy. 'ld -o swap swap.o' không. Liên kết bao gồm sao chép phần lớn ish của thời gian chạy sang thực thi. Vấn đề chính xác là gì? –
@Jester Tôi sẽ xem xét điều đó ngay bây giờ! – mrDudePerson