【发布时间】: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'