我想问一下在linux编译linux 下载openjdkk时没成功错误不知道啥意思,各位大神谁能帮我看看

下次自动登录
现在的位置:
& 综合 & 正文
在Linux下编译OpenJdk并调试Hotspot
对于大多数Java程序员来说,JVM就是一个黑盒子,我们一般不必关心它内部是怎么运作的。但是万一碰到JVM bug导致的Crash呢,又或者只是因为好奇想了解JVM的内部世界,那么就需要编译和调试JVM。
1. JVM(Java Virtual Machine)
翻译过来就是Java虚拟机,所谓虚拟机是相对传统的计算机而言的。
传统的计算机有很多体系架构,比如x86,Sparc等等;一个体系架构一般有类似的指令集,比如586兼容所有386的指令集,但是又有自己扩充的指令。在Java出现之前,大部分编译型语言(我不知道是不是所有的)都会由编译器把源代码编译成特定机器下特定指令集的机器指令。从理论上来说所有的机器的表达能力都是一样的,等价于图灵机这个理论模型。但是就具体实现而言,在不同机器实现同一个逻辑的机器指令是不同的,这就导致在一台机器编译的二进制文件可能无法在另一台机器上运行(这里不考虑操作系统的差异)。当然写得比较好的c代码是可以在不同平台编译,但是一般不太可能把一个windows下的exe程序让linux运行。(当然除了机器指令的差别,不同系统的二进制格式也是不能兼容的,比如windows
pe和linux elf)。即使同一个操作系统,比如linux,在x86下编译的程序也是没办法在Sparc下跑的,因为Sparc根本不认识x86的指令。
JVM就是一个虚拟机,它定义了自己的指令集(Java字节码),所有的Java程序编译成统一的字节码,然后JVM负责在不同的硬件和操作系统下解释或者编译字节码。
JVM本身只是一个概念,一种抽象
2. JRE(Java Runtime Environment)
Java运行时环境,首先必须实现JVM规范,实现同样的JVM规范可以有很多方法,比如Sun有Sun的实现,IBM有IBM的实现。
JVM当然得实现Java语言,也就是java.lang.*,认识int,知道class,方法,...
但是如果你发现没有java.util.* 或者没有java.io.*时,是不是会发现没法写Java程序了呢?
没有util,你当然可以自己实现那些常见的数据结构,这可以用java实现;那没有io呢?那似乎没法写出跨平台的代码了。
所以除了实现语言本身,Java还定义了很多跨平台的API,比如java.awt java.io等等。这些可能是我们非常常用的,所以Sun把它们叫作了Java Standard Edition(Java SE)。一般以java开头
另外有些API,比如JDBC,这是连接数据库的API。这些组成了Java Enterprise Edition(Java EE)。一般以javax包开头
这些API有些是用Java实现,但很多不跨平台的必须由C实现(JVM通过JNI规范来实现Java和c的数据传递),所以JRE必须实现这些
3. JDK(Java Development Kit)
*开发者的工具,最常用的就是javac编译器。和vc或者gcc一样,必须要有工具把源代码编译成目标代码,c的目标代码是机器相关的,而Java的目标代码就是字节码。
*当然实现javac就是实现一个传统的编译器,词法分析,语法分析和语义分析,然后翻译成字节码。这本身不是件简单的事情,所以编译器的开发者也开发了一些帮助开发编译器的工具,比如我们熟悉的lex/flex,yacc/bison。java也实现了类似的JavaCC和JFlex。
除了javac,javadoc和javah也是很常用的工具。此外Java的新特性,比如范型(Generics)和注解(Annotations),这些也需要由编译器来处理。(范型只影响编译,编译后被擦除了,但是Annotation可能会运行时能通过反射获取)。这些代码一般都是Java实现,打包到tools.jar。所以如果你需要动态编译Java代码(比如JSP),那么你可能要用到tools.jar
Linux下Build Open Jdk 7和Debug Hotspot
下面的内容大部分参考下面两篇文章:
不过在用NetBeans调试Hotspot时碰到了一些问题(可能是我用了比较新的netbeans的缘故),之前问过作者,不过没有得到满意的解答,后来自己使用了一些trick的手段。
1. 获取源代码
1.1 使用 Mercurial 获取最新代码(其实就是svn git这样的scm工具)
速度比较慢,可能要花几个小时吧,如果你需要最新代码又不想等,可以找我
1.2 直接下载压缩的源代码包
解压后就可以了,如果想更新代码,也可以运行 sh ./getSource.sh更新
1.3 源代码结构
hotspot的源代码,完整的工程,包括makefile,文件按平台分类,比如 hotspot/src下有4个目录:os cpu os_cpu share
很明显,share放的是于平台无关的代码,os里放的是特定os的代码,cpu放的是特定cpu的代码,os_cpu放的是特定os和cpu的代码
java api的代码,如果我们对jdk的代码感兴趣,比如想看ConcurrentHashMap的实现,那么可以去src/share/classes/java/util/concurrent/ConcurrentHashMap.java
它的目录结果是 share,linux,solaris和windows,和前面类似,share放的是操作系统无关的代码,一般是用Java实现。Windows当然放的是windows的实现,不过*nix的都是放到solaris下实现的,不同的操作系统通过不同的#define区别,所以大部分代码都在solaris下,linux目录下只有一些文档。大部分代码都是c实现,然后通过JNI让java调用,所以大部分代码都在native下而不是classes下。
编译器工具,比如javac,javah,apt等等工具
比如jaxp,corba等等,暂时不感兴趣
./share/classes/java/util/concurrent/ConcurrentHashMap.java
2. 编译和调试
大部分应该都装好了,比如gcc,make,ant,bootstrap jdk,还有一些需要安装,比如cups等Sun没有版权的代码,你必须自己从网上下载(或者通过Linux发行版的仓库安装)
由于我的机器很早以前编译的,当时编译时少一个装一个,所以忘了要装哪些了,碰到问题的可以google,也可以找我讨论(我也可能解决不了,我对Linux也不是很熟悉)
可以使用 make sanity 测试,请设置如下的环境变量(我的是bash):
export LANG=C
unset JAVA_HOME
export ALT_BOOTDIR=/home/lili/java/jdk1.6.0_26/
export ALLOW_DOWNLOADS=true
export USE_PRECOMPILED_HEADER=true
export SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=true
export DEBUG_NAME=debug
2.1 编译JDK
如果make sanity通过,那么直接运行 make,如果你想保留日志,那么可以 make 2&&1 |tee ~/buildopenjdk7.log
可能会碰到问题,需要你解决。如果顺利的话,几个小时后应该能编译好。
2.2 编译结果
费了这么大的力气,我们看看编译的成果。
编译的结果放到了build/linux-i586-debug下,
编译后的二进制文件,比如java,javac等等
jar包,比如tools.jar
我们最感兴趣的jvm,具体运行和调试会在下面介绍
java api部分,包括按包组织的java类
运行一下自己编译的jdk
lili@lili-desktop:/media/d/openjdk7zip/openjdk/build/linux-i586-debug/j2sdk-image$ ./bin/java -version
openjdk version "1.7.0-internal-debug"
OpenJDK Runtime Environment (build 1.7.0-internal-debug-lili__12_30-b00)
OpenJDK Server VM (build 21.0-b17-jvmg, mixed mode)
lili@lili-desktop:/media/d/openjdk7zip/openjdk/build/linux-i586-debug/j2sdk-image$
编译hotspot
前面说过了,我们感兴趣的是hotspot。如果想学习util里的实现,直接能看java代码,如果想学习io或者nio,那么可以直接看native c的实现(java通过JNI调用)。
比如我们修改了hotspot的代码,当然可以重新编译整个JDK,但这太慢,我们可以只重新编译hotspot自己
环境变量和前面一样,需要ALT_BOOTDIR和ALT_OUTPUTDIR
使用:cd hotspot/make && make jvmg jvmg1
target jvmg会编译Server版本的Hotspot,并且是带调试符号的,jvmg1会编译Client版本的,同样也是带调试符号的。因为优化可能会调整代码顺序或者去掉一些无用的代码等,这会给调试带来困难,所以如果我们是为了学习的话,用这两个target就好了。
如果需要优化的版本可以用target optimized或者optimized1,同样后面有1的表示Client;产品的target是product和product1
2.5 运行hotspot
*需要增加两个环境变量LD_LIBRARY_PATH和JAVA_HOME,前者参考下面,里面包含我们编译好的libjvm.so,后者可以用我们自己编译的jdk
export LD_LIBRARY_PATH=/media/d/openjdk7zip/openjdk/build/hotspot_debug/linux_i486_compiler1/jvmg
export JAVA_HOME=/media/d/openjdk7zip/openjdk/build/linux-i586-debug/j2sdk-image
cd /media/d/openjdk7zip/openjdk/build/hotspot_debug/linux_i486_compiler1/jvmg
lili@lili-desktop:/media/d/openjdk7zip/openjdk/build/hotspot_debug/linux_i486_compiler1/jvmg$ ./gamma -versionlili@lili-desktop:/media/d/openjdk7zip/openjdk/build/hotspot_debug/linux_i486_compiler1/jvmg$ ./gamma -version
Using java runtime at: /media/d/openjdk7zip/openjdk/build/linux-i586-debug/j2sdk-image/jre
openjdk version "1.7.0-internal-debug"
OpenJDK Runtime Environment (build 1.7.0-internal-debug-lili__12_30-b00)
OpenJDK Client VM (build 21.0-b17-internal-jvmg, mixed mode)Using java runtime at: /media/d/openjdk7zip/openjdk/build/linux-i586-debug/j2sdk-image/jreopenjdk version "1.7.0-internal-debug"
OpenJDK Runtime Environment (build 1.7.0-internal-debug-lili__12_30-b00)
OpenJDK Client VM (build 21.0-b17-internal-jvmg, mixed mode
2.6 使用gdb调试hotspot
前面我们编译出来的hotspot已经是带有调试符号,所以可以使用gdb来调试了。
gdb ./gamma
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
(gdb) break main
Starting program: /media/d/openjdk7zip/openjdk/build/hotspot_debug/linux_i486_compiler1/jvmg/gamma
[Thread debugging using libthread_db enabled]
Breakpoint 1, main (argc=1, argv=0xbffff1a4)
at /media/d/openjdk7zip/openjdk/hotspot/src/share/tools/launcher/java.c:228
(gdb) (gdb)
可以看到,gamma测试程序的入口是hotspot/src/share/tools/launcher/java.c。
2.7 使用Netbeans调试hotspot
对于习惯GNU/Linux环境开发的c程序员来说,有源代码和Makefile,再配合vim或者emacs,使用它们的插件比如cscope来阅读代码,gdb来调试程序,是件很自然的事情。
不过对于习惯的IDE的Java程序员来说,这确实有的不爽。估计Sun的人也是这样的,所以他们内部是使用Netbeans来调试hotspot的。
这篇blog是基于Netbeans6,里面很多都是为了解决nb的bug,我使用的是Netbeans7,所以很多bug已经修正。
2.7.1 NB项目设置
新建项目-&C/C+-&基于现有源代码的C/C+项目
指定包含源代码的目录:/media/d/openjdk7zip/openjdk/hotspot,由于makefile不在这个目录下,而是在它的子目录下,所以选择“定制”模式。
然后选择好Makefile的位置。下一步进入build的配置
make的工作目录是make,
生成命令是${MAKE} -f Makefile jvmg,
清理命令是${MAKE} -f Makefile clean,
生成结果填写一个目录就可以了。
然后点击确定就会buildhotspot,不过这样会出现问题,因为缺少ALT_BOOTDIR环境变量,但是Netbeans好像只能设置运行时的环境变量,而不能设置build时的环境变量,参考
这篇文章 。我折腾了好久也没有搞定,最后也没搞定。最后只能使了个毛招:
因为它默认去/java/re/j2se/1.6.0/latest/binaries/linux-i586找jdk,所以可以建个符号链接
lili@lili-desktop:/java/re/j2se/1.6.0/latest/binaries$ ll linux-i586
lrwxrwxrwx 1 lili lili 28 Nov 14 18:14 linux-i586 -& /home/lili/java/jdk1.6.0_26/
这下可以点击确定,让它build。
2.7.2 删除“无用”的文件
因为hotspot是跨平台的项目,前面可以看到针对不同的平台会有不同的实现,但是很多文件是相同的,比如文件名相同,因此同一个方法可能在linux里有个实现,windows有个实现,
这样NB就不知道到底会是哪个了,这会对Code Assistance带来影响,另外我们查看定义也会带来问题。所以针对Linux平台,我们可以在NB里删除不需要的文件(这不是删除磁盘上的文件,而是在NB里删除)
可以删除的目录:
hotspot/agent/src/os/solaris
hotspot/agent/src/os/win32
hotspot/agent/src/share/native/jvmdi
hotspot/src/cpu/sparc
hotspot/src/os/solaris
hotspot/src/os/windows
hotspot/src/os_cpu/solaris_sparc
hotspot/src/os_cpu/solaris_x86
hotspot/src/os_cpu/windows_x86
hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp
hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp
可以删除的文件(我的机器是x86,所以把x86-64的那些文件可以删掉):
hotspot/src/cpu/x86/vm/assembler_x86_64.cpp
hotspot/src/cpu/x86/vm/assembler_x86_64.hpp
hotspot/src/cpu/x86/vm/assembler_x86_64.inline.hpp
hotspot/src/cpu/x86/vm/dump_x86_64.cpp
hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp
hotspot/src/cpu/x86/vm/interp_masm_x86_64.hpp
hotspot/src/cpu/x86/vm/interpreterRT_x86_64.cpp
hotspot/src/cpu/x86/vm/interpreter_x86_64.cpp
hotspot/src/cpu/x86/vm/jniFastGetField_x86_64.cpp
hotspot/src/cpu/x86/vm/runtime_x86_64.cpp
hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp
hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp
hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp
hotspot/src/cpu/x86/vm/templateTable_x86_64.hpp
hotspot/src/cpu/x86/vm/vm_version_x86_64.cpp
hotspot/src/cpu/x86/vm/vm_version_x86_64.hpp
hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp
hotspot/src/cpu/x86/vm/x86_64.ad
hotspot/src/os_cpu/linux_x86/vm/assembler_linux_x86_64.cpp
hotspot/src/os_cpu/linux_x86/vm/linux_x86_64.ad
hotspot/src/os_cpu/linux_x86/vm/linux_x86_64.s
2.7.3 在NB里调试
修改项目属性-&运行
运行命令:"{OUTPUT_PATH}" -XX:StopInterpreterAt=1 -version (如果想调试某个Java类,那么配好-classpath和类名)
运行目录:make
环境变量:配置好JAVA_HOME和LD_LIBRARY_PATH
在java.c的main里头加个断点
右键点击项目-&调试
have fun ~
&&&&推荐文章:
【上篇】【下篇】Ubuntu 下编译OpenJDK,OpenJDk debug,OpenJDk fastdebug - CSDN博客
Ubuntu 下编译OpenJDK,OpenJDk debug,OpenJDk fastdebug
OpenJDK 编译
环境说明:
系统:Ubuntu 12.04-amd64
OpenJDk源码下载地址:http://openjdk.java.net
详细步骤请阅读源码包中的README-builds.html
1.安装JDK7所需要的依赖包
sudo apt-get build-dep openjdk-7
2.编译脚本
#!/bin/bash
export LANG=C
export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk-amd64/
export ALLOW_DOWNLOADS=true #是否需要自动下载,jaxp,jaws可以自动下载
export SKIP_DEBUG_BUILD=false #是否跳过编译debug版
export SKIP_FASTDEBUG_BUILD=false #是否跳过编译fastdebug版
export DEBUG_NAME=debug
unset CLASSPATH
unset JAVA_HOME
make sanity && make
3.编译成功后会出现在build目录中
4.安装时可能会遇到这些错误:
1).src/share/vm/runtime/interfaceSupport.hpp:430:0: error: &__LEAF& redefined [-Werror]
/usr/include/x86_64-linux-gnu/sys/cdefs.h:44:0: note: this is the location of the previous definition
解决方案:
http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/rev/a6eef545f1a2
2).在编译时会遇到和&javax/sound/jsoundalsa&相关的一个错误,网上搜了一下这个貌似是openjdk的一个bug,有人提供了补丁http://mail.openjdk.java.net/pipermail/build-dev/2012-January/005382.html。只需要修改openjdk/jdk/make/javax/sound/jsoundalsa目录下的Makefile文件,找到LDFLAGS += -lasound&
修改为:OTHER_LDLIBS += -lasound
本文已收录于以下专栏:
相关文章推荐
1、环境:ubuntu12.04+gcc 4.6.3
目前还没有在mac上编译成功过
2、下载openjdk
http://openjdk.java.net
3、安装JDK7所需要的依赖包...
编绎整个OpenJDK要很久,而且有很多东西是不需要的。研究HotSpot的话,其实只要下HotSpot部分的代码就可以了。
下面简单记录下编绎调试HotSpot一些步骤。
进入hot...
编译OpenJDK请看我上一篇文章RedHat/CentOS linux 6 环境编译openJDK7一、下载并安装Netbeans 7.0.1 (c/c++)
http://share.weiyu...
看了深入理解Java虚拟机:JVM高级特性与最佳实践(第2版) 之后决定自己编译一下OpenJDK,但是书中介绍的关于编译和调试部分已经过时了。所以根据搜索的资料,自己编译调试了一下。IDE:Netb...
netbeans 导入hotspot 构建时,报错can't cd to /java/re/j2se/1.6.0/latest/binaries/linux-i586因为它默认去/java/re/j2...
首先我们来说一下JDK的问题,一般我们用的是oracle的JDK,这边我们要查看编译的是OpenJDK。先看一下两者之间的关系:
从上面可以看到,黑色部分是代码一致的,So,两者之间的源代码大部...
前言原本以为搭建一个编译环境很简单,理想很丰满,现实很骨感,前前后后花了一周时间,不水了,水多了都是泪。
Win10下安装ubuntu虚拟机按照[VMware Ubuntu安装详细过程](http:/...
安装依赖命令:
一 环境软件预备
操作系统:ubuntu12.04lts64位
openjdk:openjdk-7-fcs-src-b147-27_jun_2011.zip 此时官网最新版为openjdk-7u4...
我想编译一个JDK。
于是两年前,我买了一本《深入理解Java虚拟机》,学着里边的样子,一步一步的在Windows下编译一种Java虚拟机OpenJDK。尝试了一周,没有成功,于是,我放弃了。
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)16:01 提问
编译openjdk总是出现这个问题, 怎么解决呢
rm -f libjvm.so.1; ln -s libjvm.so libjvm.so.1;
[ -f libjvm.so ] || { ln -s libjvm.so libjvm. ln -s libjvm.so.1 libjvm.so.1; }; \
if [ \"\" = \"\" ] ; then
if [ -x /usr/sbin/selinuxenabled ] ; then
/usr/sbin/
if [ $? = 0 ] ; then
/usr/bin/chcon -t textrel_shlib_t libjvm.
if [ $? != 0 ]; then
echo "ERROR: Cannot chcon libjvm.so";
Linking vm...
/usr/bin/objcopy --only-keep-debug libjvm.so libjvm.debuginfo
/usr/bin/objcopy --add-gnu-debuglink=libjvm.debuginfo libjvm.so
strip -g libjvm.so
[ -f libjvm.debuginfo ] || ln -s libjvm.debuginfo libjvm.debuginfo
zip -q -y libjvm.diz libjvm.debuginfo libjvm.debuginfo
rm -f libjvm.debuginfo libjvm.debuginfo
[ -f libjvm.diz ] || { ln -s libjvm.diz libjvm. }
echo Linking launcher...
Linking launcher...
gcc -m64 -Xlinker -O1 -Wl,--hash-style=both
-Xlinker -z -Xlinker noexecstack -m64 -Xlinker -export-dynamic
-L pwd -o gamma launcher/java_md.o launcher/java.o launcher/jli_util.o launcher/wildcard.o -ljvm -lm -ldl -lpthread
make[6]: Leaving directory '/home/qu/openjdk/builddir/hotspot/outputdir/linux_amd64_compiler2/product'
make[5]: Leaving directory '/home/qu/openjdk/builddir/hotspot/outputdir/linux_amd64_compiler2/product'
cd linux_amd64_compiler2/product && ./test_gamma
Using java runtime at: /usr/lib/jvm/jdk1.7.0_79/jre
./gamma: relocation error: /usr/lib/jvm/jdk1.7.0_79/jre/lib/amd64/libjava.so: symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
/home/qu/openjdk/hotspot/make/linux/Makefile:290: recipe for target 'product' failed
make[4]: *** [product] Error 127
make[4]: Leaving directory '/home/qu/openjdk/builddir/hotspot/outputdir'
Makefile:191: recipe for target 'generic_build2' failed
make[3]: *** [generic_build2] Error 2
make[3]: Leaving directory '/home/qu/openjdk/hotspot/make'
Makefile:151: recipe for target 'product' failed
make[2]: *** [product] Error 2
make[2]: Leaving directory '/home/qu/openjdk/hotspot/make'
make/hotspot-rules.gmk:111: recipe for target 'hotspot-build' failed
make[1]: *** [hotspot-build] Error 2
make[1]: Leaving directory '/home/qu/openjdk'
Makefile:251: recipe for target 'build_product_image' failed
make: *** [build_product_image] Error 2
按赞数排序
relocation error: /usr/lib/jvm/jdk1.7.0_79/jre/lib/amd64/libjava.so: symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!
其他相关推荐最近刚开始看《深入理解JAVA虚拟机》这本书。第一章的实践是自己手动编译openjdk7,但书上的步骤都是基于windows的,于是在网上搜了一下linux下编译openjdk的资料:&&&这辆篇文章都说的比较详细。其实,最好的文档是openjdk源码包中的README-builds.html,网上的资料基本是对其的翻译+精简。&资料已经那么全了,我就不重复了,主要是记录一些自己碰到的问题。&1. 编译期间会依赖很多其他的包,ubuntu下最简单的方法是sudo apt-get build-dep openjdk-7(文档里些的是sudo aptitude build-dep openjdk-6,但新版的ubuntu貌似已经不自带aptitude,用apt-get会比较方便,另外我把openjdk6改成了openjdk7,编译没出问题,应该两者依赖的包没有什么区别)。这样的话,就不需要挨个下载依赖包编译,也省去了设置一堆环境变量(例如ALT_CUPS_HEADERS_PATH ALT_FREETYPE_LIB_PATH ALT_FREETYPE_HEADERS_PATH)。&我最终的环境变量设置为:&
Java代码&&
export&LANG=C&&&&
export&ALT_BOOTDIR=$JAVA_HOME&&&&
export&ALLOW_DOWNLOADS=true&&&&
unset&CLASSPATH&&&&
unset&JAVA_HOME&&
以上设置缺一不可。&2. 另外,如果你的系统版本比较新的话,可能会无法通过hotsopt的系统版本检查,这个时候只需要修改openjdk/hotspot/make/linux下的Makefile文件。注释掉如下几行就OK了。&
Java代码&&
check_os_version:&&
#ifeq&($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),)&&
#&&&$(QUIETLY)&&&2&echo&"***&This&OS&is&not&supported:"&`uname&-a`;&exit&1;&&
3. 可能会遇到和"javax/sound/jsoundalsa"相关的一个错误,网上搜了一下这个貌似是openjdk的一个bug,有人提供了补丁。只需要修改openjdk/jdk/make/javax/sound/jsoundalsa目录下的Makefile文件,找到&
Java代码&&
LDFLAGS&+=&-lasound&&
将其替换成&
Java代码&&
OTHER_LDLIBS&+=&-lasound&&
即可。&也有说换成EXTRA_LIBS的(),没有试过,不知道可不可行。&
Java代码&&
EXTRA_LIBS&+=&-lasound &
阅读(...) 评论()在Ubuntu 12.04 上编译调试 OpenJDK8 - CSDN博客
在Ubuntu 12.04 上编译调试 OpenJDK8
现在看的资料都是编译 openjdk7 的,openjdk8好像已经 openjdk7 编译方式大一样,按照前辈的文章使用
make sanity
会提示找不到 sanity 规则,然后编译过程其实基本就直接
./configure
官方的 README 写的很清楚。
下面记录下过程
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u jdk8u
bash ./get_source.sh
然后下载代码,进入代码目录:
代码目录中有一个&README-builds.html&描述了如何 build 整个系统,一些细节需要自己去寻找。
sudo aptitude build-dep openjdk-7
sudo aptitude install openjdk-7-jdk
export LANG=C
export PATH=&/usr/lib/jvm/java-7-openjdk/bin:${PATH}&
配置编译选项
bash ./configure
这样生成相应默认配置,如果有需要,比如想编译出调试版本的,可以给&configure&加参数。
A new configuration has been successfully created in
/home/minix/SourceCode/openjdk8/jdk8u/build/linux-x86-normal-server-release
using default settings.
Configuration summary:
* Debug level:
* JDK variant:
* JVM variants:
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 32
Tools summary:
* Boot JDK:
java version &1.7.0_17& Java(TM) SE Runtime Environment (build 1.7.0_17-b02) Java HotSpot(TM) Server VM (build 23.7-b01, mixed mode)
(at /home/minix/Software/jdk1.7.0_17)
* C Compiler:
gcc-4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (at /usr/bin/gcc-4.6)
* C++ Compiler:
g++-4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (at /usr/bin/g++-4.6)
Build performance summary:
* Cores to use:
* Memory limit:
* ccache status:
not installed (consider installing)
Build performance tip: ccache gives a tremendous speedup for C++ recompilations.
You do not have ccache installed. Try installing it.
You might be able to fix this by running 'sudo apt-get install ccache'.
可以看出提示缺少 ccache 包,按提示安装就可以了。从提示可以看出,编译级别是&release,另外还有几种编译级别,可以在调试时候提供更多的信息。例如:
bash ./configure --enable-debug
这样会生成&fastdebug&版本的配置信息:
A new configuration has been successfully created in
/home/minix/openjdk8/jdk8u/build/linux-x86-normal-server-fastdebug
using configure arguments '--enable-debug'.
Configuration summary:
* Debug level:
* JDK variant:
* JVM variants:
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 32
Tools summary:
* Boot JDK:
java version &1.7.0_17& Java(TM) SE Runtime Environment (build 1.7.0_17-b02) Java HotSpot(TM) Server VM (build 23.7-b01, mixed mode)
(at /home/minix/Software/jdk1.7.0_17)
* C Compiler:
gcc-4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (at /usr/bin/gcc-4.6)
* C++ Compiler:
g++-4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (at /usr/bin/g++-4.6)
Build performance summary:
* Cores to use:
* Memory limit:
* ccache status:
installed and in use
注意编译的级别已经变成&fastdebug&了。
--enable-debug&其实相当于 --with-debug-level=fastdebug, 可以通过这样的参数选项指定编译级别。一共可以指定三种级别:&release,
fastdebug, slowdebug,&slowdebug&含有最丰富的调试信息,没有这些信息,很多执行可能被优化掉,我们单步执行时,可能看不到一些变量的值。所以最好指定slowdebug&为编译级别
就可以了,如果提示
No CONF given, but more than one configuration found in /home/minix/openjdk8/jdk8u//build.
Available configurations:
* linux-x86-normal-server-fastdebug
* linux-x86-normal-server-release
Please retry building with CONF=&config pattern& (or SPEC=&specfile&)
需要指定使用哪个编译配置:
make CONF=linux-x86-normal-server-fastdebug
最后编译成功后,会提示:
----- Build times -------
00:00:30 corba
00:13:38 hotspot
00:00:22 jaxp
00:00:30 jaxws
00:04:10 jdk
00:00:29 langtools
00:19:39 TOTAL
查看&build&目录,可以看到&linux-x86-normal-server-fastdebug
切换到&jdk/bin&目录:
cd linux-x86-normal-server-fastdebug/jdk/bin/
运行可执行文件 java
./java -version
会得到提示
openjdk version &1.8.0-internal-fastdebug&
OpenJDK Runtime Environment (build 1.8.0-internal-fastdebug-minix__10_56-b00)
OpenJDK Server VM (build 25.40-b05-fastdebug, mixed mode)
下面展示一个启动&GDB, 加断点,并运行一个 Java 程序的过程。
$ gdb java
GNU gdb (Ubuntu/Linaro 7.4-ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &http://gnu.org/licenses/gpl.html&
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type &show copying&
and &show warranty& for details.
This GDB was configured as &i686-linux-gnu&.
For bug reporting instructions, please see:
&http://bugs.launchpad.net/gdb-linaro/&...
Reading symbols from /home/minix/openjdk8/jdk8u/build/fastdebug/jdk/bin/java...done.
(gdb) b main
Breakpoint 1 at 0x8048410: file /home/minix/openjdk8/jdk8u/jdk/src/share/bin/main.c, line 94.
(gdb) r -classpath PossibleReordering
Starting program: /home/minix/openjdk8/jdk8u/build/fastdebug/jdk/bin/java -classpath PossibleReordering
[Thread debugging using libthread_db enabled]
Using host libthread_db library &/lib/i386-linux-gnu/libthread_db.so.1&.
Breakpoint 1, main (argc=3, argv=0xbfffeca4)
at /home/minix/openjdk8/jdk8u/jdk/src/share/bin/main.c:94
本文已收录于以下专栏:
相关文章推荐
主要写了使用 JVMTI 中需要的几个关键问题,包括 jni functions 的使用,线程安全,调试技巧。
想深入了解Java的运行机制,我们有必要了解HotSpot虚拟机;下面我们先在CentOS6.4 64位系统上编译OpenJDK8源码,然后用gdb断点调试hotspot源码,最后再配置在eclips...
从 openjdk8 源代码的角度, 介绍了 java.exe 如何启动虚拟机并执行Java程序的过程。
在Ubuntu14下构建Hotspot并使用Eclipse调试
德胜 发布于 8个月前,共有 2 条评论
偶尔会看一点点JVM代码,所以尝试构建了一把最新的OpenJDK8
OpenJDK 8 编译 Ubuntu 16.04
声明:本教程在64位windows8.1编译32位JVM
一.编译环境准备
     1.OpenJDK下载
      OpenJDK是sun公司在2006年JavaOne大会上JDK开源部分建立起...
1.配置环境依赖sudo apt-get install build-essential g++-multilib gcc-multilib ant libxrender-dev xorg-dev l...
使用CentOS 安装jdk SE1.8
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 openjdk 1.8 linux 的文章

 

随机推荐