2012-02-11 29 views
2

請有人幫忙。 我創建一個共享庫,並與本指令運行此給出了一個錯誤 「GCC -shared libx.o -o libx.so」希望對內存級共享庫有很好的理解

/usr/lib64/gcc/x86_64-suse-linux/4.3/ ../../../../x86_64-suse-linux/bin/ld:libx.o:在創建共享對象時,無法使用針對`.rodata'的重定位R_X86_64_32; 重新編譯-fPIC libx.o:看不懂的符號:

collect2錯誤值:LD返回1退出狀態

所以,我用-fPIC運行它,它編譯,請你給我一個對內存級的-FPIC意義有很好的理解,我的意思是它是如何在使用這個共享庫的兩個程序之間的物理內存中共享的。

非常感謝。

+0

[GCC -fPIC選項]的可能重複(https://stackoverflow.com/questions/5311515/gcc-fpic-option) – 2017-07-27 22:03:36

回答

1

的副本對於虛擬內存系統加載器很可能會共享代碼映射到在一些連續的頁面正在使用該庫的應用程序的內存空間。爲了在多個進程之間共享這些頁面,它們必須是:

  1. 只讀。
  2. 能夠映射到進程的地址空間中的任意位置。

後果:

  1. 大多數代碼是不是隻讀的,因爲它不能只是被映射到進程的內存空間,並運行 - 它必須首先通過的方式加載程序進行修改這是特定於每個過程。爲了實現只讀文本,您需要將-fpic選項傳遞給編譯器。這會導致編譯器生成較不理想的機器碼,但具有隻讀的優點。

  2. 有效代碼通常不能映射到地址空間中的任意位置。通常高效的代碼要麼限制在特定的地址上,要麼限制在低地址範圍內。 -fpic選項指示編譯器使用效率較低的代碼,但不受運行位置約束的限制。

現在我們能理解您的問題:

反對搬遷R_X86_64_32`.RODATA」 - 這裏的鏈接器警告您的編譯器使用的被限制在運行於低範圍的codgen地址。因此,它不適合在共享庫中使用。