序言:这个问题不关于Oracle,相反,我想了解gcc-4和gcc-6在处理位置无关性方面的根本区别代码。
所以我决定在Debian stretch 上尝试安装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,则所有链接都没有任何问题。
因此我的两个问题:
答案 0 :(得分:0)
默认情况下,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选项后,链接可以正常运行。
答案 1 :(得分:0)
来自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