Trong một dự án, đồng nghiệp của tôi tạo một thư viện tĩnh, ví dụ: liba.a, được liên kết với ứng dụng.Làm thế nào tôi có thể liên kết libc.a vào thư viện dùng chung trong arm-linux arm-none-linux-gnueabi-gcc
Trong liba.a, anh ấy ghi đè libc malloc() lên phiên bản chủ sở hữu của anh ấy.
Tôi tạo thư viện được chia sẻ libs.so cũng được liên kết với ứng dụng.
Vấn đề là khi libs.so của tôi liên kết với ứng dụng, malloc() được sử dụng trong libs.so của tôi sẽ là một trong liba.a, không phải là một trong libc.so chuẩn, điều này gây ra vấn đề.
Sau đó, tôi muốn liên kết tĩnh libc.a với libs.so của tôi, tôi đã sử dụng cờ -static -shared -fPIC cho gcc.
Nhưng tôi luôn nhận được arm-2012.03/bin /../ lib/gcc/arm-none-linux-gnueabi/4.6.3 /../../../../ arm-none-linux -gnueabi/bin/ld: arm-2012.03/bin /../ arm-none-linux-gnueabi/libc/usr/lib/libc.a (dl-tsd.o) (. văn bản + 0x14): R_ARM_TLS_LE32 di chuyển không được phép trong đối tượng được chia sẻ.
Có ai có ý tưởng về nó không?
Xin cảm ơn về phía trước.
Tôi nghĩ rằng -static -share không nên được trộn lẫn ... – Jeyaram
Văn bản sau đây được sao chép từ ld.pdf từ bộ mã vạch: "-static Không liên kết với các thư viện được chia sẻ. Điều này chỉ có ý nghĩa trên nền tảng mà đã chia sẻ ** Tùy chọn này có thể được sử dụng với 'chia sẻ' **. Làm như vậy có nghĩa là một thư viện được chia sẻ là đang được tạo nhưng tất cả các tham chiếu bên ngoài của thư viện phải được giải quyết bằng cách kéo các mục từ thư viện tĩnh . " –
@DavidChyi: Điều đó chỉ nói -static và -shared có thể được trộn lẫn, nhưng không phải đó là một ý tưởng hay. Các trình biên dịch nói chung có nhiều tùy chọn không phải là một ý tưởng tốt để sử dụng cho các ứng dụng bình thường. Chúng rất quan trọng đối với các trường hợp đặc biệt như biên dịch kernel, bootloader, mã vi điều khiển và như vậy. –