jvm15版本源码阅读之make定位程序入口


  Jvm的编译依然是cpp的传统编译模式,使用了autoconf生成configure脚本,通过执行configure脚本来生成各个目录或自工程的makefile文件,有了makefile文件执行gun的make命令,生成最终的可执行文件.
  这个过程都知道,对应导入到clion中的jvm源码工程,那么问题来了:
  要使用java命令运行或调试,那么这个java只是一个二进制可执行文件,真正的程序入口在哪里?是哪个cpp文件的main方法?
  要回答这个问题不容易,因为jvm工程很大;要回答这个问题也容易,因为cpp写的工程十分的清晰和优雅,没有一丝哪怕是混乱的感觉,只要从头顺着看完,就自然能找到答案.

1 bash configure做了什么

  进入工程目录的configure脚本,可以看到这个只是一个简单的包装,主要是确定了该脚本的绝对地址,最后一行为:

bash ${-:+-$-} -c ". $this_script_dir/make/autoconf/configure" $this_script_dir/configure CHECKME $this_script_dir "$@"

  实际调用的是make/autoconf/configure文件

1.1 make/autoconf/configure

  这个文件才是真正要执行的configure文件,进入,找到如下主要的命令段落:
在这里插入图片描述
  exec执行generated_script,输入参数是conf_processed_arguments[@],也就是–with-debug-level=slowdebug.这里generated_script就是如下所示的脚本,过程是之前的shell命令产生的,这里不再详述,读者可顺着脚本自行查看.
在这里插入图片描述

  此脚本生成了各个makefile,本身也很大,有3.2M,但所有的内容写的很清楚,只是多而已.

2 bash make做了什么

2.1 make

  首先makefile的写法在gnu中是固定的,类似于shell script脚本,整体命令比较简单,所以这里不再详细介绍,可以参考相关资料.
  从工程目录的Makefile进入,可以看到其最后一行引入了Init.gmk文件,就如注释所说,这才是主体构造文件的入口

在这里插入图片描述
  进入位于make目录下的Init.gmk文件,前面的都是一些设置和准备,现在到最后部分,此处开始真正进入核心构建文件
在这里插入图片描述

  红框标出的就是Main.gmk,这个就是核心构建文件.
  进入Main.gmk,首先就是确认是否加载spec.gmk文件,该文件里面定义了很多诸如文件路径等基本参数,其次就是引入了一些基础的构建文件,如下所示
在这里插入图片描述
  这里着重看一下引入的MakeBase.gmk文件,进入到此段代码处
在这里插入图片描述

  可见,此处记录了每个可执行文件的源文件来源,就在SUPPORT_OUTPUTDIR目录下,定位这个变量
在这里插入图片描述
  可见,是在spec.gmk中定义的,也就是之前说的spec构建文件,进入可知
在这里插入图片描述

3 java可执行文件是由哪些source文件生成

  如上所示,OUTPUTDIR就是build的目录(在spec.gmk中可以找到,这里不在展示),在build目录下的support目录中,进入该目录
在这里插入图片描述

  可见,相关的构建过程信息都存在native里的java.base中,进入该目录,找到java的可执行文件信息
在这里插入图片描述
  红框标出的就是java入口main的中间依赖,包括中间依赖main.d文件,目标文件main.d.targets,输出文件main.o及命令行mian.o.cmdline和日志main.o.log.只需要进入main.d查看以依赖就能知道在源代码层面main方法的位置在哪里.
  进入mian.d,可知
在这里插入图片描述

4 真正的程序入口

  上面红框标出的就是该main.o输出文件的依赖,红星就是第一个依赖,其实就是main方法的入口地点,进入/src/java.base/share/native/launcher/main.c文件
在这里插入图片描述
  Java命令的main方法找到了.注释就明确给出了这是入口,之后就可以调试了.

5 总结

  仅从jvm的程序入口就能感知到这是一款非常优秀的软件.它的书写无不给人一种美的认知,令人愉悦的优雅的美.
  jvm源码在编译时已经对所有的可执行文件记录了编译过程中的详细信息,都可以查到对应的源码及依赖.无须多言,清晰可见.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值