编译,链接,加载

编译、链接、加载

编译、链接、加载是基础,十几年前从《深入理解计算机系统》等相关书籍中获得了比较全面的理解,现在已经变得有些模糊了。当时没有做总结的习惯,现在零零散散的记一些吧,有时间还要重温书本。

Build time

在这里插入图片描述

编译器将输入的源文件编译为汇编文件。

汇编器将输入的汇编文件翻译为机器码,将结果存在目标文件中;并为每个目标文件和指令分配内存地址,这个地址可能是真实的物理地址也可能是虚拟地址,虚拟地址是相对第一条指令的偏移量。

连接器解决所有目标文件中的内存引用,然后将所有的目标文件合并为一个可执行文件;具体分为两步:第一步找到所有引用的模块,方法和变量,第二步确定它们加载时的绝对物理地址。

加载器将可执行程序加载到内存,并初始化应用程序和数据栈,初始化寄存器,然后交给CPU执行。

Java
In Java, dynamic linking is the default behavior.
The Java Virtual Machine (JVM) resolves references to external classes and methods by loading the required libraries from the classpath when they are needed at runtime.However, Java also supports static linking through the use of tools like Ahead-of-Time (AOT) compilation.

FeatureStatic LinkingDynamic Linking
Linking timeCompile timeRuntime
Executable sizeLargerSmaller
Execution speedFasterSlower
FlexibilityLessMore
Default in JavaNoYes

Android

在Android系统上,通过System.getenv("BOOTCLASSPATH") 可以打印出如下内容:

/apex/com.android.art/javalib/core-oj.jar:
/apex/com.android.art/javalib/core-libart.jar:
/apex/com.android.art/javalib/okhttp.jar:
/apex/com.android.art/javalib/bouncycastle.jar:
/apex/com.android.art/javalib/apache-xml.jar:
/system/framework/framework.jar:
/system/framework/framework-graphics.jar:
/system/framework/ext.jar:
/system/framework/telephony-common.jar:
/system/framework/voip-common.jar:
/system/framework/ims-common.jar:
/apex/com.android.i18n/javalib/core-icu4j.jar:
/system/framework/android.car.jar:
/apex/com.android.appsearch/javalib/framework-appsearch.jar:
/apex/com.android.conscrypt/javalib/conscrypt.jar:
/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar:
/apex/com.android.media/javalib/updatable-media.jar:
/apex/com.android.mediaprovider/javalib/framework-mediaprovider.jar:
/apex/com.android.os.statsd/javalib/framework-statsd.jar:
/apex/com.android.permission/javalib/framework-permission.jar:
/apex/com.android.permission/javalib/framework-permission-s.jar:
/apex/com.android.scheduling/javalib/framework-scheduling.jar:
/apex/com.android.sdkext/javalib/framework-sdkextensions.jar:
/apex/com.android.tethering/javalib/framework-connectivity.jar:
/apex/com.android.tethering/javalib/framework-tethering.jar:
/apex/com.android.wifi/javalib/framework-wifi.jar

通过System.getenv("SYSTEMSERVERCLASSPATH") 可以打印出如下内容:

/system/framework/com.android.location.provider.jar:
/system/framework/services.jar:
/system/framework/ethernet-service.jar:
/system/framework/car-frameworks-service.jar:
/apex/com.android.appsearch/javalib/service-appsearch.jar:
/apex/com.android.media/javalib/service-media-s.jar:
/apex/com.android.permission/javalib/service-permission.jar

如果是第三方的shared library, 则需要在AndroidManifest.xml文件中使用<uses-library android:name=*** />将所需要link的library注明,这样Android framework在加载App的时候才能link到library中的类。 由于相关部分代码未细读,所以不知详情;在项目中一个App依赖了7个libary,而这7个library中有部分之间有依赖关系,使用<uses-library android:name=*** />将7个library都添加后,运行时发现有的library是无法正常link的。

Runtime

Processes are operating system tasks spawned from executables.

下面的图展示了进程的内存分布:
在这里插入图片描述
build system以及runtime/process

C and Java

Shared library


参考资料:

  • https://www.baeldung.com/cs/compiler-linker-assembler-loader
  • https://www.baeldung.com/cs/process-control-block
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值