[英]Linking error when building OpenJDK8 with gcc 6
我正在嘗試使用gcc6構建OpenJDK 8:
$ hg clone http://hg.openjdk.java.net/jdk8 jdk8
$ cd jdk8
$ bash get_source.sh
$ bash ./configure
$ make images
如此處或此處所述 ,我必須更新make文件以將以下選項添加到gcc:
-Wno-deprecated-declarations
-Wno-error=deprecated-declarations
-Wno-error=narrowing
-fno-exceptions
-fvisibility=hidden
-fno-delete-null-pointer-checks
-fno-lifetime-dse
看來現在一切正常。 但是,在鏈接時,它在以下命令上失敗:
/usr/bin/x86_64-linux-gnu-gcc-6
-Xlinker --hash-style=both
-Xlinker -z
-Xlinker defs -shared
-L/home/johnd/src/build_jdk/jdk8/jdk/lib/amd64
-L/home/johnd/src/build_jdk/jdk8/jdk/lib/amd64/server
-Xlinker -z
-Xlinker origin
-Xlinker -rpath
-Xlinker \$ORIGIN
-Xlinker -version-script=/home/johnd/src/build_jdk/jdk8/jdk/make/mapfiles/libzip/mapfile-vers
-Xlinker -soname=libzip.so
-o /home/johnd/src/build_jdk/jdk8/jdk/lib/amd64/libzip.so
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/Adler32.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/CRC32.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/Deflater.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/Inflater.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/ZipFile.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/compress.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/deflate.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/gzclose.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/gzlib.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/gzread.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/gzwrite.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/infback.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/inffast.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/inflate.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/inftrees.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/trees.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/uncompr.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/zadler32.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/zcrc32.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/zip_util.o
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/zutil.o
-ljvm
-ljava
它給出以下錯誤:
/home/johnd/src/build_jdk/jdk8/jdk/objs/libzip/ZipFile.o: In function `Java_java_util_zip_ZipFile_open':
/home/johnd/src/build_jdk/jdk8/jdk/src/share/native/java/util/zip/ZipFile.c:109: undefined reference to `throwFileNotFoundException'
collect2: error: ld returned 1 exit status
令人驚訝的是,符號'throwFileNotFoundException'顯然是在libjava中定義的,它被指定為鏈接器的參數。
$ nm ./jdk/lib/amd64/libjava.so | grep throw
000000000001b0cd t throwFileNotFoundException
000000000001721b t throwIOException
知道發生了什么事以及如何解決嗎?
您似乎已經克隆了JDK 8 GA源(即2014年)。 他們比gcc6早了大約兩年。
相反,請從JDK 8 Updates Project中克隆最新的源代碼,然后重試,即使用hg.openjdk.java.net/jdk8u/jdk8u。
似乎尚未為gcc6修補最新版本的OpenJDK8。 這是我使用Debian的OpenJDK8軟件包中的補丁為gcc6修補OpenJDK8的方法:
# apt-get install build-essentials
# apt-get build-dep openjdk-8
$ apt-get source openjdk-8
以下是Debian軟件包中的補丁列表:
$ ls -1 openjdk-8-8u144-b01/debian/patches/
8141491.diff
8164293.diff
aarch32.diff
aarch64.diff
accessible-toolkit.patch
adlc-parser.patch
alpha-float-const.diff
applet-hole.patch
atk-wrapper-security.patch
autoconf-select.diff
autoconf-updates.diff
bootstrap-with-gcj.diff
compare-pointer-with-literal.patch
compiler-flags.diff
default-jvm-cfg-aarch64.diff
default-jvm-cfg-default.diff
disable-doclint-by-default.diff
dnd-files.patch
dont-strip-images.diff
enumipv6-fix.patch
fontconfig-japanese.diff
fontconfig-korean-nanum.diff
fontconfig-wqy-microhei.patch
gcc6.diff
[...]
在應用補丁之前,請下載最新的OpenJDK8源:
$ hg clone http://hg.openjdk.java.net/jdk8u/jdk8u
$ cd jdk8u
$ bash get_source.sh
然后應用補丁:
$ patch -p1 < /path/to/openjdk-8-8u144-b01/debian/patches/gcc6.diff
$ patch -p1 < /path/to/openjdk-8-8u144-b01/debian/patches/8141491.diff
$ patch -p1 < /path/to/openjdk-8-8u144-b01/debian/patches/hotspot-warn-no-errformat.diff
$ patch -p1 < /path/to/openjdk-8-8u144-b01/debian/patches/hotspot-set-compiler.diff
$ patch -p1 < /path/to/openjdk-8-8u144-b01/debian/patches/hotspot-disable-werror.diff
然后編譯:
$ bash ./configure
$ make
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.