Tôi biết -fPIC
tùy chọn '' có liên quan đến việc phân giải địa chỉ và tính độc lập giữa các mô-đun riêng lẻ, nhưng tôi không chắc nó thực sự có ý nghĩa gì. Bạn có thể giải thích?
Tôi biết -fPIC
tùy chọn '' có liên quan đến việc phân giải địa chỉ và tính độc lập giữa các mô-đun riêng lẻ, nhưng tôi không chắc nó thực sự có ý nghĩa gì. Bạn có thể giải thích?
Câu trả lời:
PIC là viết tắt của Mã độc lập vị trí
và trích dẫn man gcc
:
Nếu được hỗ trợ cho máy đích, hãy phát ra mã không phụ thuộc vào vị trí, phù hợp với liên kết động và tránh mọi giới hạn về kích thước của bảng bù chung. Tùy chọn này tạo ra sự khác biệt trên m68k, PowerPC và SPARC. Mã độc lập với vị trí yêu cầu hỗ trợ đặc biệt và do đó chỉ hoạt động trên một số máy nhất định.
sử dụng điều này khi xây dựng các đối tượng được chia sẻ (* .so) trên các kiến trúc được đề cập.
/usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
vì vậy tôi đã thêm fPIC và nó được xây dựng.
Đây f
là tiền tố gcc cho các tùy chọn "kiểm soát các quy ước giao diện được sử dụng trong quá trình tạo mã"
Là PIC
viết tắt của "Mã độc lập vị trí", nó là một sự đặc biệt của fpic
m68K và SPARC.
Chỉnh sửa: Sau khi đọc trang 11 của tài liệu được tham chiếu bởi 0x6adb015 và nhận xét của coryan, tôi đã thực hiện một số thay đổi:
Tùy chọn này chỉ có ý nghĩa đối với các thư viện được chia sẻ và bạn đang cho hệ điều hành biết rằng bạn đang sử dụng Bảng bù đắp toàn cầu, GOT. Điều này có nghĩa là tất cả các tham chiếu địa chỉ của bạn đều liên quan đến GOT và mã có thể được chia sẻ qua nhiều quy trình.
Nếu không, nếu không có tùy chọn này, bộ nạp sẽ phải tự sửa đổi tất cả các hiệu số.
Không cần phải nói, chúng tôi hầu như luôn sử dụng -fpic / PIC.
man gcc
nói:
-fpic Tạo mã độc lập vị trí (PIC) phù hợp để sử dụng trong một chia sẻ thư viện, nếu được hỗ trợ cho máy đích. Mã như vậy truy cập tất cả các địa chỉ không đổi thông qua một bảng bù toàn cục (GOT). Năng động trình tải giải quyết các mục GOT khi chương trình bắt đầu (động bộ nạp không phải là một phần của GCC; nó là một phần của hệ điều hành). Nếu kích thước GOT cho tệp thực thi được liên kết vượt quá một máy cụ thể kích thước tối đa, bạn nhận được thông báo lỗi từ trình liên kết cho biết rằng -fpic không hoạt động; trong trường hợp đó, hãy biên dịch lại bằng -fPIC. (Các mức tối đa này là 8k trên SPARC và 32k trên m68k và RS / 6000. 386 không có giới hạn như vậy.) Mã độc lập với vị trí yêu cầu hỗ trợ đặc biệt và do đó chỉ hoạt động trên một số máy nhất định. Đối với 386, GCC hỗ trợ PIC cho Hệ thống V nhưng không dành cho Mặt trời 386i. Mã được tạo cho IBM RS / 6000 luôn độc lập về vị trí. -fPIC Nếu được hỗ trợ cho máy đích, hãy phát mã độc lập về vị trí, thích hợp cho liên kết động và tránh bất kỳ giới hạn nào về kích thước của bảng bù toàn cục. Tùy chọn này tạo ra sự khác biệt trên m68k và SPARC. Mã độc lập với vị trí yêu cầu hỗ trợ đặc biệt và do đó chỉ hoạt động trên một số máy nhất định.