0

序言:这个问题不是关于 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,则所有链接都可以顺利完成。

因此我的2个问题:

  • gcc 版本 4 和 6 之间的 -fPIC 和 -fPIE 的默认值是否有变化?很可能是的,版本 6 似乎默认使用 2 个选项。
  • 对我来说更重要的是:gcc 版本 6 是否可以选择使用版本 4 的行为来生成与位置无关的代码?(或者我迟早会因为 gcc-4 不再可用而无法链接旧库?)
4

2 回答 2

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 拉伸

于 2017-11-25T19:33:40.117 回答
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

事实上,在 Oracle 使用的 gcc 选项中添加-no-pie后,链接工作没有任何错误。

于 2017-08-22T14:14:11.903 回答