-FPIC có nghĩa là gì khi xây dựng một thư viện chia sẻ?


109

Tôi biết -fPICtù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?


1
Ngoài ra, trong trường hợp bạn muốn biết chi tiết hơn, có một bài viết tuyệt vời ở đây ( akkadia.org/drepper/dsohowto.pdf )
MJ

Câu trả lời:


61

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.


1
f không có nghĩa gì cả, nó chỉ là một phần của tên tùy chọn.
Zifre

17
Có một sự khác biệt giữa fpic và fPIC. Cả hai đều làm điều tương tự nhưng fpic sử dụng độ lệch tương đối ngắn hơn nếu có. Do đó, việc biên dịch bằng fpic có thể tạo ra các tệp nhỏ hơn. Thật không may, nó không phải lúc nào cũng hoạt động như mong đợi vì vậy hãy sử dụng fPIC. Cũng lưu ý rằng không phải tất cả các bộ vi xử lý đều hỗ trợ hiệu số ngắn hơn nên nó có thể không tạo ra sự khác biệt.
Martin York

2
'F' là một sự nôn nao so với cách mà gcc xử lý các đối số dòng lệnh (đây là một vài năm trước và họ đã thay đổi phần này của mã mà tôi chưa xem xét gần đây). Nhưng tại thời điểm đó, chỉ một số chữ cái hoặc tổ hợp nhất định được phép sử dụng trong các điều kiện khác nhau (có một ngôn ngữ rất phức tạp để xác định các đối số dòng lệnh) do đó, 'f' được sử dụng để dễ dàng xác định như một đối số dòng lệnh.
Martin York

2
Điều gì sẽ xảy ra nếu người ta xây dựng một * .so mà không có fPIC?
Isa A

2
@IsaA Hôm nay tôi đang biên dịch một hàm mysql c-api từ nguồn và nó sẽ không được xây dựng, /usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPICvì vậy tôi đã thêm fPIC và nó được xây dựng.
ớtNUT

32

Đây flà 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ã"

PICviết tắt của "Mã độc lập vị trí", nó là một sự đặc biệt của fpicm68K 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.


1
Tôi nghĩ rằng hệ điều hành có thể tự do tải thư viện trong bất kỳ địa chỉ ảo nào, nhưng không có pic / PIC, trình tải phải sửa đổi mã và điều chỉnh tất cả các bước nhảy + hướng dẫn tuyệt đối đến vị trí thực của các thói quen / thư viện. Với pic / PIC, mã không bị sửa đổi và do đó nó thực sự được chia sẻ trên nhiều quy trình.
coryan

Nhiều quy trình phần lớn là ngẫu nhiên - chúng có điểm mấu chốt là mã có thể được tải tại bất kỳ địa chỉ ảo nào với số lần sửa địa chỉ tối thiểu tuyệt đối.
Jonathan Leffler

16

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.