Biên dịch mã thành tệp đối tượng cần phải được thực hiện độc lập nếu tệp đối tượng được dự định được tải dưới dạng thư viện được chia sẻ (.so
), vì địa chỉ ảo cơ sở mà tệp đối tượng được chia sẻ được tải vào trong các quy trình khác nhau có thể khác nhau.Mã 32 bit x86 có cần phải được biên dịch PIC đặc biệt cho các tệp thư viện được chia sẻ không?
Hiện tại, tôi không gặp phải lỗi khi cố gắng tải tệp .so
được biên dịch và liên kết mà không cần tùy chọn -fpic
GCC trên máy tính 32 bit x86, trong khi máy tính không hoạt động trên máy tính 64 bit bit x86.
Trang web ngẫu nhiên tôi thấy rằng tôi không cần -fpic
trên 32 bit vì mã được biên dịch không -fpic
hoạt động theo trùng hợp ngẫu nhiên theo X86 32bit ABI cũng được sử dụng theo cách độc lập. Nhưng tôi vẫn tìm thấy phần mềm có các phiên bản riêng biệt của thư viện trong các phiên bản 32bit của họ: Một cho PIC, và một cho non-PIC. Ví dụ, trình biên dịch intel đi kèm với libirc.a
và libirc_pic.a
, sau đó được biên dịch cho chế độ độc lập vị trí (nếu muốn liên kết tệp .a
đó thành tệp .so
).
Tôi tự hỏi sự khác biệt chính xác giữa việc sử dụng -fpic
và không sử dụng mã cho mã 32 bit là gì và tại sao một số gói, như trình biên dịch intel vẫn gửi với các phiên bản riêng biệt của thư viện?
Bạn đã thử sử dụng TLS chưa biên dịch mã không? Hoặc tải một số thư viện non-pic với phạm vi bộ nhớ chồng chéo? Riêng biệt libs tĩnh là để liên kết vào các chương trình tĩnh (libirc.a; không có pic là một chút nhanh hơn) và vào thư viện .so tĩnh (_pic.a phiên bản). – osgx
Xem http://stackoverflow.com/questions/3146744/difference-in-position-independent-code-x86-vs-x86-64 – AProgrammer