终于在solaris上把icu编译过去了

由于google的部分网站被封,所以icu的主页根本打不开,要想把icu下载下来,也花了好大功夫。像往常那样./configure,make,但是在链接的时候报错

错误是:ld: 致命的: 重定位仍旧与可分配但不可写的节相反
以下是出错的时候的log
make[0]: Making `all' in `stubdata'
make[1]: Entering directory `/usr/software/icu/source/stubdata'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/usr/software/icu/source/stubdata'
make[0]: Making `all' in `common'
make[1]: Entering directory `/usr/software/icu/source/common'
g++-4.3.2 -m64 -ggdb -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long -D__STDC__=0 -fvisibility=hidden -shared -h libicuuc.so.42 -o ../lib/libicuuc.so.42.1 errorcode.o putil.o umath.o utypes.o uinvchar.o umutex.o ucln_cmn.o uinit.o uobject.o cmemory.o udata.o ucmndata.o udatamem.o umapfile.o udataswp.o ucol_swp.o utrace.o uhash.o uhash_us.o uenum.o ustrenum.o uvector.o ustack.o uvectr32.o ucnv.o ucnv_bld.o ucnv_cnv.o ucnv_io.o ucnv_cb.o ucnv_err.o ucnvlat1.o ucnv_u7.o ucnv_u8.o ucnv_u16.o ucnv_u32.o ucnvscsu.o ucnvbocu.o ucnv_ext.o ucnvmbcs.o ucnv2022.o ucnvhz.o ucnv_lmb.o ucnvisci.o ucnvdisp.o ucnv_set.o uresbund.o ures_cnv.o uresdata.o resbund.o resbund_cnv.o ucat.o locmap.o uloc.o locid.o locutil.o bytestream.o stringpiece.o ustr_cnv.o unistr_cnv.o unistr.o unistr_case.o unistr_props.o utf_impl.o ustring.o ustrcase.o ucasemap.o cstring.o ustrfmt.o ustrtrns.o ustr_wcs.o utext.o normlzr.o unorm.o unormcmp.o unorm_it.o chariter.o schriter.o uchriter.o uiter.o uchar.o uprops.o ucase.o propname.o ubidi_props.o ubidi.o ubidiwrt.o ubidiln.o ushape.o uscript.o usc_impl.o unames.o utrie.o utrie2.o utrie2_builder.o bmpset.o unisetspan.o uset_props.o uniset_props.o uset.o uniset.o usetiter.o ruleiter.o caniter.o unifilt.o unifunct.o uarrsort.o brkiter.o ubrk.o brkeng.o dictbe.o triedict.o rbbi.o rbbidata.o rbbinode.o rbbirb.o rbbiscan.o rbbisetb.o rbbistbl.o rbbitblb.o serv.o servnotf.o servls.o servlk.o servlkf.o servrbf.o servslkf.o uidna.o usprep.o punycode.o util.o util_props.o parsepos.o locbased.o cwchar.o wintz.o mutex.o dtintrv.o ucnvsel.o propsvec.o ulist.o uloc_tag.o -L../lib -L../stubdata -licudata -lpthread -lm
文本重定位持续 引用的
针对符号 位移 在文件中
UDataMemory_init_4_2 0xac udatamem.o
UDataMemory_init_4_2 0x16f udatamem.o
udata_getHeaderSize_4_2 0x40d ucmndata.o
udata_getHeaderSize_4_2 0x494 ucmndata.o

。。。。。。。

问题是出在ld上。我用的gcc是solaris自带的。

# gcc -v
Reading specs from /usr/sfw/lib/gcc/i386-pc-solaris2.11/3.4.3/specs
Configured with: /builds2/sfwnv-111a/usr/src/cmd/gcc/gcc-3.4.3/configure --prefix=/usr/sfw --with-as=/usr/sfw/bin/gas --with-gnu-as --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c,c++,f77,objc --enable-shared
Thread model: posix

而它所用的ld是solaris的ld,不是gnu的ld。gcc采用什么样的ld(gnu的还是系统默认的)是在编译期决定的而不是运行期。今天仔细看了下,原因是icu在声明函数的时候,如果发现是gnu的编译器,就会加上 __attribute__ ((visibility ("default"))); 这样的声明。并且在编译的时候加上-fvisibility =hidden,默认将所有函数都藏起来(除了应该export的)
但实际上,solaris的ld和gnu的ld大相径庭,这样编译出来的gcc是不支持visibility属性的。
warning: visibility attribute not supported in this configuration; ignored

说到底还是configure.in不够智能。但是因为重新生configure需要autoconf 2.63及以上版本,而我的autoconf太老了。所以干脆直接改了configure

# diff -C5 configure configure.old
*** configure 2009-09-25 16:52:36.760622933 +0800
--- configure.old 2009-09-25 16:50:30.864849969 +0800
***************
*** 5039,5049 ****
$as_echo_n "checking for library API export... " >&6; }
SHAREDLIBEXPORT=no
U_USE_GCC_VISIBILITY_ATTRIBUTE=0
OLD_CFLAGS="${CFLAGS}"
OLD_CXXFLAGS="${CXXFLAGS}"
! if test "$ac_cv_c_compiler_gnu" = no; then
LIBCFLAGS="-fvisibility=hidden"
LIBCXXFLAGS="-fvisibility=hidden"
CFLAGS="${CFLAGS} ${LIBCFLAGS}"
CXXFLAGS="${CXXFLAGS} ${LIBCXXFLAGS}"
cat >conftest.$ac_ext <<_ACEOF
--- 5039,5049 ----
$as_echo_n "checking for library API export... " >&6; }
SHAREDLIBEXPORT=no
U_USE_GCC_VISIBILITY_ATTRIBUTE=0
OLD_CFLAGS="${CFLAGS}"
OLD_CXXFLAGS="${CXXFLAGS}"
! if test "$ac_cv_c_compiler_gnu" = yes; then
LIBCFLAGS="-fvisibility=hidden"
LIBCXXFLAGS="-fvisibility=hidden"
CFLAGS="${CFLAGS} ${LIBCFLAGS}"
CXXFLAGS="${CXXFLAGS} ${LIBCXXFLAGS}"
cat >conftest.$ac_ext <<_ACEOF

之后就一路通畅了。虽说某些预期的效果没有达到,但还是可以用滴。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥