【问题标题】:gcc error undefined symbol compiling perl 5.22 on aix 7.1gcc 错误未定义符号在 aix 7.1 上编译 perl 5.22
【发布时间】:2015-12-17 04:15:22
【问题描述】:

尝试使用 gcc 4.2.0 在 AIX 7.1 上编译 perl 5.22.0。 gcc 来自 AIX 7.1 附带的 AIX 工具箱。我需要构建一个 perl 来与我们的产品一起发布,客户坚持这样做。

我在 perl 的配置中使用了以下设置,结果很好

sh Configure -des -Dcc=gcc -Dprefix=/my/own/dir -Duserelocatableinc

然后我运行make,它退出并出现以下错误:

gcc -maix32 -c -DPERL_CORE -D_ALL_SOURCE -D_ANSI_C_SOURCE -D_POSIX_SOURCE -DUSE_NATIVE_DLOPEN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGE_FILES -D_FORTIFY_SOURCE=2 -std=c89 -O -Wall -Werror=declaration-after-statement -Wextra -Wc++-compat -Wwrite-strings caretx.c
        gcc -maix32 -o miniperl -Wl,-brtl -Wl,-bdynamic -L/usr/local/lib -Wl,-b32 -Wl,-bmaxdata:0x80000000 perlmini.o opmini.o miniperlmain.o  gv.o toke.o perly.o pad.o regcomp.o dump.o util.o mg.o reentr.o mro_core.o keywords.o hv.o av.o run.o pp_hot.o sv.o pp.o scope.o pp_ctl.o pp_sys.o doop.o doio.o regexec.o utf8.o taint.o deb.o universal.o globals.o perlio.o perlapi.o numeric.o mathoms.o locale.o pp_pack.o pp_sort.o caretx.o   -lpthread -lbind -lnsl -lgdbm -ldbm -ldl -lld -lm -lcrypt -lc
ld: 0711-317 ERROR: Undefined symbol: .__truncl128
ld: 0711-317 ERROR: Undefined symbol: .__copysignl128
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
collect2: ld returned 8 exit status
make: 1254-004 The error code from the last command is 1.

我在没有-des 开关的情况下运行sh Configure,尽我所能给出合理的答案,但得到了相同的结果。

搜索 truncl128 和/或 copysignl128 几乎没有结果。貌似是天体物理学家patched gcc 4.5 because of that。我确实尝试过自己编译 gcc 4.5,但是我需要为此安装太多东西(例如 binutils,我也必须先编译它)。更新的 gcc 的 RPM 二进制文件将我带入依赖地狱。所以我坚持使用 IBM 的工具集。

在 Perl 的 README 中找不到有关此问题的其他配置/编译器选项的提示。我是不是忽略了什么?

“128”似乎指向某些数学库中整数/数字的精度。我不需要那个。如果有一些“忘记超高精度”的开关就好了。

有人知道如何绕过编译器错误吗?是否可以使用 AIX 的标准工具?

编辑:这是 -Wl,-bloadmap:loadmap.txt 的输出:

cat loadmap.txt
(ld): setopt 64
(ld): halt 4
(ld): setopt r/o->w
(ld): setopt nodelcsect
(ld): setopt rtl
(ld): setopt rtllib
(ld): setopt symbolic:1
(ld): setfflag 4
(ld): savename miniperl
(ld): filelist 52 1
(ld): i /lib/crt0_64.o
(ld): i /tmp//ccgIAPwm.o
(ld): setopt autoimp
(ld): i perlmini.o
(ld): i opmini.o
(ld): i miniperlmain.o
(ld): i gv.o
(ld): i toke.o
(ld): i perly.o
(ld): i pad.o
(ld): i regcomp.o
(ld): i dump.o
(ld): i util.o
(ld): i mg.o
(ld): i reentr.o
(ld): i mro_core.o
(ld): i keywords.o
(ld): i hv.o
(ld): i av.o
(ld): i run.o
(ld): i pp_hot.o
(ld): i sv.o
(ld): i pp.o
(ld): i scope.o
(ld): i pp_ctl.o
(ld): i pp_sys.o
(ld): i doop.o
(ld): i doio.o
(ld): i regexec.o
(ld): i utf8.o
(ld): i taint.o
(ld): i deb.o
(ld): i universal.o
(ld): i globals.o
(ld): i perlio.o
(ld): i perlapi.o
(ld): i numeric.o
(ld): i mathoms.o
(ld): i locale.o
(ld): i pp_pack.o
(ld): i pp_sort.o
(ld): i caretx.o
(ld): lib /usr/lib/libpthread.a
(ld): lib /usr/lib/libbind.a
(ld): lib /usr/lib/libnsl.a
(ld): lib /usr/lib/libdl.a
(ld): lib /usr/lib/libld.a
(ld): lib /usr/lib/libm.a
(ld): lib /usr/lib/libcrypt.a
(ld): lib /usr/lib/libc.a
(ld): i /opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/ppc64/libgcc.a
(ld): i /opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/ppc64/libgcc_eh.a
(ld): lib /usr/lib/librtl.a
LIBRARY: Shared object libpthread.a[shr_xpg5_64.o]: 342 symbols imported.
LIBRARY: Shared object libbind.a[shr_64.o]: 412 symbols imported.
LIBRARY: Shared object libnsl.a[shr_64.o]: 430 symbols imported.
LIBRARY: Shared object libdl.a[shr_64.o]: 4 symbols imported.
LIBRARY: Shared object libcrypt.a[shr_64.o]: 8 symbols imported.
LIBRARY: Shared object libc.a[shr_64.o]: 3075 symbols imported.
LIBRARY: Shared object libc.a[posix_aio_64.o]: 20 symbols imported.
LIBRARY: Shared object libc.a[aio_64.o]: 18 symbols imported.
LIBRARY: Shared object libc.a[pse_64.o]: 8 symbols imported.
LIBRARY: Shared object libc.a[dl_64.o]: 4 symbols imported.
LIBRARY: Shared object libc.a[pty_64.o]: 1 symbols imported.
LIBRARY: Shared object librtl.a[lazy42_64.o]: 3 symbols imported.
FILELIST: Number of previously inserted files processed: 52
(ld): initfini _GLOBAL__FI_miniperl _GLOBAL__FD_miniperl
(ld): resolve
RESOLVE: 3581 of 15669 symbols were kept.
(ld): addgl /usr/lib/glink64.o
ADDGL: Glink code added for 215 symbols.
(ld): er full
ld: 0711-318 ERROR: Undefined symbols were found.
        The following symbols are in error:
 Symbol                    Inpndx  TY CL Source-File(Object-File) OR Import-File{Shared-object}
                              RLD: Address  Section  Rld-type Referencing Symbol
 ----------------------------------------------------------------------------------------------
 .__truncl128              [4]     ER PR numeric.c(numeric.o)
                                   00000524 .text    R_RBR    [64]    .Perl_my_modfl
 .__copysignl128           [6]     ER PR numeric.c(numeric.o)
                                   00000564 .text    R_RBR    [64]    .Perl_my_modfl
ER: The return code is 8.

【问题讨论】:

  • 好吧,如果你使用加载图也没关系:-Wl,-bloadmap:loadmap.txt
  • 所以编译“numeric.c”的编译器认为在某处符号 .__truncl128 和 .__copysignl128...
  • @Zsigmond:感谢您迄今为止的意见。使用来自perlaix 的设置,64 位,非线程(最值得注意的是export OBJECT_MODE=64-Duse64bitall)。在下次运行之前写了make distclean,以确保不再有“numeric.o”——结果相同。所以“numeric.c”是由同一个编译器(gcc)用相同的设置编译的,都是针对64位的(至少在我的理解中)。
  • 配置时怎么没有得到'gcc: error: unrecognized command line option '-qlongdouble'?
  • 实际上,这个消息显示:您在环境中设置了 OBJECT_MODE=64。这会强制进行完整的 64 位构建。如果这不是您想要的,请终止此程序,取消设置并重新启动。检查您的无穷大是否与长双打一起使用... gcc: unrecognized option '-qlongdouble' 您的无穷大与长双打一起正常工作。但是 64 位正是我想要的……在 config.sh 我找到了uselongdouble='undef'

标签: perl gcc aix


【解决方案1】:

好的,这不是我问题的真正答案,但我找到了解决方法,我可以接受。

解决方法是使用 perl 5.20.3。由于这个版本编译、测试和安装都很好,而且 5.20 仍然在维护,这似乎是一个可以接受的解决方案。

在 perl 5.22 中,安装文件读取:

One option for long doubles is that gcc 4.6 and later have a library
called quadmath, which implements the IEEE 754 quadruple precision
(128-bit, 113 bits of mantissa) floating point numbers.  The library
works at least on x86 and ia64 platforms.  It may be part of your gcc
installation, or you may need to install it separately.

With "Configure -Dusequadmath" you can try enabling its use, but note
the compiler dependency, you may need to also add "-Dcc=...".
At C level the type is called C<__float128> (note, not "long double"),
but Perl source knows it as NV.

我考虑在 perl.org 上提交错误报告,因为我在 Configure 和 -Dcc= 中都没有使用 -Dusequadmath 开关。但我(必须)使用 gcc 4.2,所以我会避免这样做。

@Zsigmond:你为我指明了正确的方向。如果您在这里写一个简短的答案,我会将其视为已接受的答案,因此您将获得应得的学分。感谢您的努力!

【讨论】:

  • off:我已经做了一些努力来自动化编译+安装,但没有成功......这种提示用户的方法是完全错误的(恕我直言),我希望能够指定关键字=值参数...
猜你喜欢
  • 2011-12-10
  • 2011-05-13
  • 1970-01-01
  • 2011-10-14
  • 2019-05-12
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多