簡體   English   中英

gcc -fPIC -fPIE:gcc-4和gcc-6之間的區別

[英]gcc -fPIC -fPIE: difference betweenn gcc-4 and gcc-6

序言 :這個問題不是關於Oracle的,而是我想了解gcc-4和gcc-6在處理位置獨立代碼方面的根本區別。

所以我決定嘗試的Debian 拉伸一個Oracle 12c的安裝。

在與gcc-6的鏈接階段,發出如下錯誤消息:

/usr/bin/ld: /opt/oracle/product/12.2.0/lib/libpls12.a(pci.o):
  relocation R_X86_64_32S against `.rodata.str1.4' can not be used when making a shared object;
  recompile with -fPIC.

但是,如果我將編譯器切換為使用gcc-4.9,則完成所有鏈接都不會出現任何問題。

因此,我有兩個問題:

  • gcc版本4和6之間的-fPIC和-fPIE的默認值是否有變化? 可能是的,默認情況下,版本6似乎使用了2個選項。
  • 對我來說更重要:gcc版本6是否可以選擇使用版本4的行為生成位置無關代碼? (或者由於gcc-4不再可用,我遲早將不再能夠鏈接到庫嗎?)

默認情況下,最有可能gcc-6鏈接器創建與位置無關的可執行文件。 可以按如下方式重現該問題,並通過添加鏈接器標志-no-pie來解決該問題:

UNIX # gcc-6 -g -Wall -fno-pic -c helloworld.c -o helloworld.o

UNIX # gcc-6 -g -Wall helloworld.o -o helloworld
/usr/bin/ld: helloworld.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status

UNIX # gcc-6 -g -Wall -no-pie helloworld.o -o helloworld

確實,在將-no-pie添加到Oracle使用的gcc選項之后,鏈接可以正常進行而沒有任何錯誤。

來自broeni的解決方案效果很好。 為了使其工作,我采取了一些其他步驟:

在安裝過程中,我從oracle修改了默認的鏈接器工具,編輯了文件

/opt/oracle/product/12.2.0/db1/bin/orald  

在第一行中,我被迫使用GCC鏈接器,並添加-no-pie選項:

#if [ -z "$BASH_VERSION" -o -n "$ORALD_USE_GCC" ] ; then
  exec gcc -no-pie "$@"
  exit 1
#fi

標簽:oracle 12c debian Stretch

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM