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
và
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:
- sự khác biệt là gì betwe vi 2 phương pháp liên kết này?
- 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?
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 . –