2014-10-02 14 views
7

Gần đây tôi đã tạo ra một mô-đun có thể nạp được và thấy rằng cả haiSự khác nhau giữa liên kết giữa GCC và LD là gì?

gcc -fPIC --shared -o foo.so.1 foo.c 

gcc -fPIC --shared -c foo.c 
ld --shared -o foo.so.2 foo.o 

có thể đạt được hiệu quả tương tự.

Tôi cũng phát hiện ra rằng foo.so.1 lớn hơn foo.so.2 khoảng 3KB, và

gcc -### -fPIC --shared -o foo.so.1 foo.c 

tiết lộ rằng GCC thêm chất liệu khác ngoài foo.c vào foo.so.1 (ví dụ, crtendS.o và crtn.o):

/usr/lib/gcc/x86_64-linux-gnu/4.7/collect2 "--sysroot=/" --build-id --no-add-needed --eh-frame-hdr -m elf_x86_64 "--hash-style=both" -shared -o foo.so.1 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../.. /tmp/cc3JBdCJ.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o 

Kể từ khi cả hai foo.so.1 và foo.so.2 có thể được nạp qua dlopen, tôi đã tự hỏi:

  1. sự khác biệt là gì betwe vi 2 phương pháp liên kết này?
  2. Làm crtendS.o và crtn.o có tạo sự khác biệt cho các hàm trong thư viện được tạo không?

Trả lời

6

Không có sự khác biệt về nguyên tắc. Khi bạn "liên kết bởi gcc" nó thực sự gọi là ld. Nếu bạn nhận được thông báo ở giai đoạn liên kết khi "liên kết bằng gcc", bạn sẽ ngay lập tức thấy rằng nó thực sự là từ ld. Nếu bạn muốn chuyển một số tùy chọn dòng lệnh cụ thể cho ld, giao diện dòng lệnh của gcc có các tính năng dành riêng cho mục đích đó (-Xlinker-Wl tùy chọn).

Đối với các tệp đối tượng bổ sung ... chúng có thể chứa mã khởi tạo/khởi tạo thư viện thời gian tải toàn cục được trình biên dịch thêm hoàn toàn. (Yêu cầu của thư viện chuẩn?) Bạn có thể tìm thấy một số thông tin về nó tại đây: https://gcc.gnu.org/onlinedocs/gccint/Initialization.html

+0

Nếu kết quả "gcc linking" khác với lệnh gọi ld trực tiếp thì gcc phải đạt được điều đó bằng cách chuyển đối số bổ sung (tùy chọn, libs) sang ld . –

Các vấn đề liên quan