Gần đây tôi đã nhận được:Tại sao fPIC hoàn toàn cần thiết trên 64 chứ không phải trên nền tảng 32 bit?
... di dời R_X86_64_32 đối với `biểu tượng địa phương 'không thể được sử dụng khi tạo đối tượng được chia sẻ; biên dịch lại với -fPIC
lỗi khi cố gắng biên dịch chương trình làm thư viện được chia sẻ. Bây giờ giải pháp cho điều này không quá khó (biên dịch lại tất cả các phụ thuộc với -fPIC), nhưng sau một số nghiên cứu, nó chỉ ra rằng vấn đề này chỉ xuất hiện trên các nền tảng x86-64. Trên 32 bit bất kỳ mã phụ thuộc vị trí nào vẫn có thể được di chuyển bởi trình tải động.
tốt nhất answer tôi có thể tìm thấy là:
x86 có hỗ trợ cho .text di dời (đó là những gì sẽ xảy ra khi bạn có mã vị trí-dependend). Hỗ trợ này có chi phí, tức là mỗi trang chứa việc di dời như vậy sẽ không được chia sẻ về cơ bản, ngay cả khi nó nằm trong thư viện được chia sẻ, do đó làm hỏng khái niệm chia sẻ của libs được chia sẻ. Do đó chúng tôi quyết định không cho phép này trên amd64 (cộng với nó tạo ra vấn đề nếu giá trị cần hơn 32bit, bởi vì tất cả relocs .text chỉ có kích thước 'word32')
Nhưng tôi không tìm thấy điều này khá đầy đủ . Nếu nó là trường hợp mà relocations làm hỏng khái niệm của thư viện được chia sẻ, tại sao nó có thể được thực hiện trên nền tảng 32bit? Ngoài ra, nếu có những thay đổi cần thiết cho định dạng ELF để hỗ trợ 64bit, thì tại sao không phải tất cả các trường đều tăng kích thước để phù hợp?
Đây có thể là một điểm nhỏ, nhưng được thúc đẩy bởi thực tế là a) mã được đề cập là mã khoa học và sẽ rất tuyệt nếu không phải thực hiện lần truy cập và b) thông tin này là không thể để tìm thấy ở nơi đầu tiên!
[Edit: 'Trả lời'
@awoodlands answer có lẽ là 'câu trả lời theo nghĩa đen' tốt nhất, @servn added một số thông tin tốt.
Trong một tìm kiếm để tìm thêm về các loại khác nhau của di dời tôi thấy this và cuối cùng là một x86_64 ABI reference (xem trang 68) ]
Tôi không biết câu trả lời cho câu hỏi của bạn, nhưng bạn nên lưu ý rằng ' -FPIC' hiệu suất hit được giảm bớt trên x86-64 (tương đối so với x86-32) bởi vì nó có nhiều thanh ghi, địa chỉ liên quan đến PC, và một ABI được thiết kế với PIC trong tâm trí. Tôi sẽ không nói rằng nó đã biến mất *, nhưng hãy đo nó và bạn có thể ngạc nhiên. – zwol
Điều đó dường như là sự đồng thuận, một hình phạt nhỏ về hiệu suất cho những gì được thừa nhận là một sự thuận tiện lớn. Tôi sẽ phải tự mình thử. –
Câu hỏi chính là tất nhiên tại sao một trình biên dịch có một "tùy chọn bắt buộc". "Bạn không nói từ ma thuật" là một trò chơi khá trẻ con. – MSalters