首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用gcc 6构建OpenJDK8时的链接错误

用gcc 6构建OpenJDK8时的链接错误
EN

Stack Overflow用户
提问于 2017-08-18 13:57:50
回答 2查看 329关注 0票数 0

我正在尝试用OpenJDK 8构建gcc6:

代码语言:javascript
复制
$ hg clone http://hg.openjdk.java.net/jdk8 jdk8
$ cd jdk8
$ bash get_source.sh
$ bash ./configure
$ make images

正如这里这里所解释的,我必须更新make文件,以便向gcc添加以下选项:

代码语言:javascript
复制
-Wno-deprecated-declarations 
-Wno-error=deprecated-declarations 
-Wno-error=narrowing 
-fno-exceptions 
-fvisibility=hidden 
-fno-delete-null-pointer-checks 
-fno-lifetime-dse 

现在看来一切都很好。但是,当链接到以下命令时会失败:

代码语言:javascript
复制
/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 

它给出了以下错误:

代码语言:javascript
复制
/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中定义的,它作为链接器的参数。

代码语言:javascript
复制
$ nm ./jdk/lib/amd64/libjava.so | grep throw
000000000001b0cd t throwFileNotFoundException
000000000001721b t throwIOException

你知道怎么回事吗?我怎么能修好它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-27 14:25:57

OpenJDK8的最新版本似乎还没有为gcc6打补丁。下面是我如何使用Debian的OpenJDK8包中的补丁来修补gcc6的OpenJDK8:

代码语言:javascript
复制
# apt-get install build-essentials
# apt-get build-dep openjdk-8
$ apt-get source openjdk-8

以下是Debian包中的修补程序列表:

代码语言:javascript
复制
$ 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源代码:

代码语言:javascript
复制
$ hg clone http://hg.openjdk.java.net/jdk8u/jdk8u
$ cd jdk8u
$ bash get_source.sh

然后应用修补程序:

代码语言:javascript
复制
$ 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

然后编译:

代码语言:javascript
复制
$ bash ./configure
$ make
票数 0
EN

Stack Overflow用户

发布于 2017-08-24 12:35:32

您似乎已经克隆了JDK 8 GA源(即2014年)。他们比gcc6早了大约两年。

相反,请从JDK 8更新项目克隆最新的源代码,然后重试,i.e.using hg.openjdk.java.net/jdk8u/jdk8u。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45758487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档