2010-08-23 27 views
74

Tôi đã đọc trang web gcc, nhưng tôi vẫn không thể hiểu sự khác biệt giữa -fpic-fPIC. Ai đó có thể giải thích nó, theo một cách rất đơn giản và rõ ràng?Sự khác nhau giữa các tham số gcc `-fpic` và` -fPIC` là gì?


câu hỏi liên quan:

+1

Có câu trả lời là không trong 'man gcc'but trong' thông tin gcc', mà có tài liệu hơn. – user2284570

Trả lời

90

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Sử dụng -fPIC hoặc -fpic để tạo vị trí trong mã phụ thuộc. Việc sử dụng -fPIC hoặc -fpic để tạo mã độc lập vị trí có phụ thuộc vào mục tiêu hay không. Sự lựa chọn -fPIC luôn hoạt động, nhưng có thể tạo ra mã lớn hơn -fpic (mnenomic để nhớ điều này là PIC là trong một trường hợp lớn hơn, do đó, nó có thể sản xuất số lượng lớn mã). Sử dụng tùy chọn -fpic thường tạo mã nhỏ hơn và nhanh hơn, nhưng sẽ có giới hạn dựa trên nền tảng, chẳng hạn như số lượng biểu tượng có thể nhìn thấy trên toàn cầu hoặc kích thước của mã. Trình liên kết sẽ cho bạn biết liệu nó có phù hợp khi bạn tạo thư viện được chia sẻ hay không. Khi nghi ngờ, tôi chọn -fPIC, vì nó luôn hoạt động.

+31

Hơn nữa: Tôi đã làm một thử nghiệm nhỏ ở đây (trên nền tảng x86_64), '-fPIC' và' -fpic' dường như đã tạo ra cùng một mã. Có vẻ như họ chỉ tạo ra một mã khác trên m68k, PowerPC và SPARC. –

+1

Một thử nghiệm đơn lẻ với một phiên bản gcc được biên dịch theo một cách cho một số mục tiêu. Lấy kết quả đó bằng một hạt muối, mong rằng kết quả thay đổi theo thời gian cụ thể với một công cụ như GCC. –

+0

Tôi có thể đặt câu hỏi; _globally symbols symbols_ có nghĩa là gì? –

7

Từ Gcc manual page:

Khi tạo mã cho các thư viện chia sẻ, -fpic ngụ ý -msmall dữ liệu và -fPIC ngụ ý -mlarge dữ liệu.

đâu:

-msmall-data 
-mlarge-data 
     When -mexplicit-relocs is in effect, static data is accessed via 
     gp-relative relocations. When -msmall-data is used, objects 8 
     bytes long or smaller are placed in a small data area (the 
     ".sdata" and ".sbss" sections) and are accessed via 16-bit 
     relocations off of the $gp register. This limits the size of the 
     small data area to 64KB, but allows the variables to be directly 
     accessed via a single instruction. 

     The default is -mlarge-data. With this option the data area is 
     limited to just below 2GB. Programs that require more than 2GB 
     of data must use "malloc" or "mmap" to allocate the data in the 
     heap instead of in the program's data segment. 
Các vấn đề liên quan