暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Centos编译JDK8源码

程序员升级之路 2020-09-13
483

开发机配置如下:Linux内核是2.6,Centos版本为6.9,应该差异不大。

1、准备环境

因为内核是用C++编写的,因此需要GCC,我开发机版本为8.1.0;

make为3.8.1,本来装了个较新为4.2的版本,也不行,换成3.8.1才好;


JDK

这个可能要注意,因为整个JDK源代码只有JVM等核心代码是用C/C++编写,一些类库还是Java编写的,最后需要编译为class文件,这部分的工作需要另外一个JDK来编译;网上说编译8的JDK要用1.7的,我用1.8的也可以编译通过,我用的版本是1.8.0_231。



其它还有一大堆库,可以自行用yum安装

yum -y install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel

yum -y install cups-devel

yum -y install alsa-lib-devel


2、下载源码

有两种下载方式,一个是github,地址为:

https://github.com/openjdk/jdk

另一个是用hg下载,推荐大家用hg,我用gitlab下载的代码编译一堆报错,改为hg下载再编译就通过了。


hg下载命令

    hg clone http://hg.openjdk.java.net/jdk8u/jdk8u jdk8u


    3、编译

    3.1、先进入到源代码根目录

       cd jdk8u


      3.2、然后下载源代码,默认有的代码是没下载的

        bash ./get_source.sh

        3.3、然后是配置编译参数

          bash ./configure --with-target-bits=64 --with-debug-level=slowdebug --enable-debug-symbols --with-native-debug-symbols=internal --with-extra-ldflags=-liconv


          注意几个参数

          with-debug-level=slowdebug:带调试信息,有几个选项:none即不带调试信息,还有个fastdebug的,调试信息有限,建议用slowdebug,调试信息最多。 


          enable-debug-symbols和with-native-debug-symbols:都是开启调试信息的,第1次编译的时候只开启了enable-debug-symbols,调试JVM相关函数的时候没有断点信息,带上with-native-debug-symbols就可以了。


          with-extra-ldflags=-liconv:这个是因为我在编译的时候报iconv相关函数找不到,报错如下:

            utf_md.c:(.text+0xb6): undefined reference to `libiconv_open'
            utf_md.c:(.text+0xf8): undefined reference to `libiconv_open'

            这个根据自己情况是否添加。


            3.4 开始编译

              make CONF=linux-x86_64-normal-server-slowdebug

              CONF参数是一个编译的配置,我们可以配置不同的编译参数,如一个用于生产不带调试信息,另一个带调试信息;配置好后会在build目录下生成相应的文件夹。


              4、常见编译错误

              4.1、invalid suffix on literal; C++11 requires a space between literal and string macro [-Werror=literal-suffix]

              这个是因为编译器告警级别太高,解决办法:


              修改:hotspot/make/linux/makefiles/gcc.make

                # WARNINGS_ARE_ERRORS = -Werror
                WARNINGS_ARE_ERRORS = -Wno-all

                4.2、error: left operand of shift expression ‘(-1 << 28)’ is negative [-fpermissive]


                解决办法:修改:hotspot/make/linux/makefiles/gcc.make

                增加以下内容:

                  CFLAGS += -fpermissive


                  其它错误根据情况百度下,一般来说是缺少库什么的,用yum安装就可以了;还有就是编译参数,修改相关Makefile就可以。


                  5、调试

                  经过上述编译后,我们就可以用GDB编译了,我开发机的GDB版本为9.1。

                  先写个HelloWorld的Java代码,保存为Hello.java:

                    public class Hello{
                    public static void main(String[] args){
                    System.out.println("hello world");
                    }
                    }


                    然后用javac编译下,javac的路径在:

                    ./build/linux-x86_64-normal-server-slowdebug/jdk/bin/javac


                    开始调试Java:

                      gdb ./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java

                      运行gdb后设置调试参数:

                        set args Hello

                        然后设置断点在入口的main函数:

                          break jdk/src/share/bin/main.c:97

                          接下来就可以开始在jdk源代码中遨游了。


                          一些关键的函数如下:

                            JNI_CreateJavaVM
                            JNI_GetDefaultJavaVMInitArgs
                            JNI_GetCreatedJavaVMs


                            JavaMain
                            create_vm


                            Hessian Bug修复

                            Dubbo2.7试用

                            RabbitMQ跨机房迁移数据零丢失

                            扩展Redis:增加Redis命令



                            文章转载自程序员升级之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论