首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

加载器会重写机器代码中的绝对地址吗?

加载器是计算机系统中的一个重要组件,用于将程序从存储器加载到内存中执行。加载器的主要功能是解析可执行文件,并将其转换为可执行的机器代码。在这个过程中,加载器会对机器代码进行一系列的处理和修改,以确保程序能够正确地在内存中执行。

加载器在加载可执行文件时,会将文件中的绝对地址转换为相对地址。这是因为可执行文件在不同的内存地址空间中执行时,其绝对地址会发生变化。加载器会根据程序的加载地址,将绝对地址转换为相对地址,以保证程序能够正确地访问内存中的数据和指令。

因此,加载器会重写机器代码中的绝对地址,将其转换为相对地址。这个过程被称为重定位(relocation)。加载器会根据程序的加载地址和内存布局,计算出相对地址的偏移量,并将其应用到机器代码中的绝对地址上,从而得到正确的相对地址。

加载器重写机器代码中的绝对地址的目的是为了实现程序的位置无关性。通过将绝对地址转换为相对地址,程序可以在不同的内存地址空间中加载和执行,而不需要对机器代码进行修改。这样,程序可以更加灵活地在不同的环境中运行,提高了代码的可移植性和可重用性。

总结起来,加载器会重写机器代码中的绝对地址,将其转换为相对地址,以实现程序的位置无关性。这样可以提高程序的可移植性和可重用性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

12道囊括重要东西 Java 基础问题

采用字节码好处是什么? 在 Java ,JVM可以理解代码就叫做字节码(即扩展名为 .class 文件),它不面向任何特定处理,只面向虚拟机。...我们需要格外注意是 .class->机器码 这一步。在这一步 JVM 类加载首先加载字节码文件,然后通过解释逐行解释执行,这种方式执行速度相对比较慢。...当 JIT 编译完成第一次编译后,其会将字节码对应机器码保存下来,下次可以直接使用。而我们知道,机器运行效率肯定是高于 Java 解释。...但是,这不是绝对。有时,即使您不打算在计算机上进行任何Java开发,仍然需要安装JDK。例如,如果要使用JSP部署Web应用程序,那么从技术上讲,您只是在应用程序服务运行Java程序。...如果同时实现两个接口,接口中定义了一样默认方法,则必须重写,不然会报错。 抽象类必须要有抽象方法? 抽象类不一定包含抽象方法,但是包含抽象方法类一定要被声明为抽象类。

52730

30道“热乎乎” JVM 典型题目剖析!

问题 类加载是按需加载,可以一次性加载全部? 解答 如果是默认加载机制,那么是你代码运行过程,遇到什么类加载什么类。如果你要自己加载类,那么需要写自己加载 ? 问题十 ?...解答 其实关于这个问题,不用过于纠结,每一层类加载对某个类加载,上推给父类加载,到顶层类加载,如果发现自己加载不到,再下推回子类加载加载,这样可以保证绝对不会重复加载某个类。...问题 还是没有明白 jvm和平时运行在机器系统之间是什么关系呢 解答 其实很简单,你运行在机器系统,其实就是一个JVM进程,JVM进程执行你系统里写好那些代码 ? 问题十三 ?...解答 自己写一个类,继承ClassLoader类,重写加载方法,然后在代码里面可以用自己加载去针对某个路径下加载到内存里来 ? 问题二十四 ?...问题 老师,类加载是把jar包里所有类一次性全部加载进去? 解答 不是的,首先加载包含main方法主类,接着是运行你写代码时候,遇到你用了什么类,再加载什么类 ? 二十七 ?

59010

【面试题】2018年最全Java面试通关秘籍第二套!

s=new String("abc")区别; HashSet方法里面的hashcode存在哪,如果重写equals不重写hashcode怎么样?...Java在什么时候会出现内存泄漏; Java大对象如何进行存储; rt.jar被什么类加载加载,什么时间加载; 自己写类被什么加载,什么时间加载; 自己写两个不同类是被同一个类加载加载...几种常用内存调试工具:jmap、jstack、jconsole; 类加载五个过程:加载、验证、准备、解析、初始化; G1停顿,CMS回收步骤,CMS为什么会停顿,停顿时间; 栈主要存数据是什么,...操作系统虚拟地址、逻辑地址、线性地址、物理地址概念及区别; 内存页面置换算法; 内存页面置换算法; 进程调度算法,操作系统是如何调度进程; 父子进程、孤儿进程、僵死进程等概念; fork...分布式系统,每台机器如何产生一个唯一随机值; 系统量级、pv、uv等; 什么是Hash一致性算法?

69910

深入解析java虚拟机:详细类可用机制,类加载、链接、初始化

寄存机器指令集更紧凑,性能也可能更好;栈式机器指令集易于编译生成,两者各有千秋,并无绝对优势一方。 类加载 在了解了Java字节码基本概念后,就可以步入类可用机制世界了。...所谓标准表示是指对于相同字符串常量返回唯一内存地址。StringTable则是用来存放这些标准表示字符串哈希容器。...那么,如何让方法同时具备可解释执行、可执行编译后机器代码能力呢?HotSpot VM实现是在方法中放置解释、编译入口地址,需要哪种模式就进入哪种入口。 第二个问题,在哪里设置这些入口呢?...结合类实现过程,在前面的类加载没有提到,而后面的类初始化执行代码,说明在执行代码时入口已设置,即它们是在类链接阶段设置。...,当编译/解释模式切换时,入口地址相应切换,如从解释切换到编译,编译完成后会设置新_code、_from_compiled_entry和_from_interpreter_entry入口;如果发生退优化

67830

Java常用API

但是对于有经验开发人员来说,知道机器人厂商一定会提供一些用于控制机器Java类,这些类定义好了操作机器人各种动作方法。...,一般重写该方法用以展示对象字段信息 public class Student { String name; int age; // 重写 toString 方法...:完整包名.类名@堆内存地址,通常我们用快捷键来重写这个方法来获取我们需要数据信息 equals() 作用 用来比较两个对象地址是否相同 public boolean equals(Object...总结 Object类是所有类基类,提供了一个无参构造方法和一些公共方法 通过重写toString方法来获取对象数据 通过重写equals方法和hashCode方法来判断两个对象是否相同,这两个方法必须同时重写...在 System 类提供设施,有标准输入、标准输出和错误输出流;对外部定义属性和环境变量访问;加载文件和库方法;还有快速复制数组一部分实用方法。

1K40

Java高质量面试总结

常见加载 Java类初始化顺序 Java类初始化顺序: 基类静态代码块,基类静态成员变量(并列优先级,按照代码中出现先后顺序执行,并且只有第一次加载时执行) 派生类静态代码块,派生类静态成员变量...重载和重写都是使用相同名称实现不同功能,但是重载是编译时活动,重写是运行时活动 可以在同一个类重载方法,但只能在子类重写方法,重写必须要有继承 重载: 重载时候,方法名要一样,但是参数类型和参数个数不一样...比如包括pigeon线程池? JVM加载过程,双亲委派模型中有哪些方法?...初始化 双亲委派模型方法: 双亲委派是指如果一个类收到类加载请求,不会自己先尝试加载,先找父类加载完成.当顶层启动类加载表示无法加载这个类时候,子类才会自己去加载.当回到最开始发起者加载还无法加载时...,并不会向下找,而是抛出ClassNotFound异常 启动(Bootstrap)类加载 标准扩展(Extension)类加载 应用程序(Application)类加载 上下文(Custom)类加载

43610

java面试题汇总一(持续更新)

JVM:java虚拟机,运用硬件或软件手段实现虚拟计算机,Java虚拟机包括:寄存,堆栈,处理 5.Java是否需要开发人员回收内存垃圾? 大多情况下是不需要。...静态变量在内存只有一份拷贝,在JVM加载时候,只为静态分配一次内存。 Static修饰代码块叫静态代码块,通常用来做程序优化。静态代码代码在整个类加载时候只会执行一次。...可以重载,必须重写 52.如果父类只有有参构造方法,那么子类必须要重写父类构造方法? 必须重写 53.创建一个子类对象时候,那么父类构造方法会执行吗? 执行。...但进程有独立地址空间,进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是一个进程不同执行路径。...99.如果对象引用被置为null,垃圾收集是否立即释放对象占用内存? 不会,在下一个垃圾回收周期中,这个对象将是可被回收

44900

java面试题汇总-基础篇

特点: 1.枚举构造是私有的。 2.枚举不能被继承。 3.枚举是绝对单例,即使是反序列化也无法创建多个实例。 使用场景: 当变量只能从一堆固定取出一个时,那么就应该使用枚举。...方法重写一般在继承,子类重写父类方法,既然是重写一遍,那么方法名和参数部分一定是相同。只是实现功能不同。...toString()默认输出对象内存地址,一般不希望输出内存地址可以重写toString()方法。...所以在业务逻辑,我们一般重写equals()方法。 equals()与hashCode()有什么联系?...双亲委派机制是指当一个类加载收到一个类加载请求时,该类加载首先会把请求委派给父类加载。每个类加载都是如此,只有在父类加载在自己搜索范围内找不到指定类时,子类加载才会尝试自己去加载

75910

Java面向对象特性总结

Java是编译成字节码给JVM运行,而面向过程直接编译成机器码执行 复用性:面对对象封装,继承极大扩展了代码复用性 2.面对对象特征——封装 封装核心思想是隐藏实现,暴露接口。...子类对象实例化过程 new出一个子类对象时候,必须先new出一个父类对象。子类在调用构造方法时,先调用父类构造方法。(默认) 如果不写构造方法,编译默认加上一个无参构造。...如果写了构造,编译不会添加。 如果写了有参构造,子类就必须调用父类构造方法。super(参数)。 如果同时有有参和无参构造,那么默认调用无参。也可以自定义调用有参。...对于基本类型就是比较值,对于引用类型 就是比较内存地址。 equals的话,,如果该方法没有被重写过默认等同于==; 但是很多类默认重写了:(比如String) ? 6.包装类使用 ?...即:不可以调用非静态属性和方法。 若有多个静态代码块,那么按照从上到下顺序依次执行。 静态代码执行要先于非静态代码块。 静态代码块随着类加载加载,且只执行一次。

46010

JVM之JVM初探

,类加载加载链接初始化后将数据保存在JVM运行时数据区文件。...解释不用介绍了,将Java字节码指令翻译为机器能够识别的指令;JIT即时编译是因为光靠解释运行效率低,所以对于热点代码进行编译为机器指令以加快运行效率(刚开启时候得先需要通过解释解释运行,当符合热点代码特征时...,直接编译成本地代码之后热点代码就可以直接运行不用在经过解释再运行了。...** 方法区内存回收 方法区用于存储已被虚拟机加载类型信息,常量,静态变量,被即时编译编译后代码缓存。...3.加载该类ClassLoader已经被回收 关于回收那些事 1.当触发GC时,对象被标记为垃圾就一定会被回收? 2.GCRoots就是固定那些值

45910

最最最常见Java面试题总结——第二周

先看下java编译和解释:    Java引入了虚拟机概念,即在机器和编译程序之间加入了一层抽象虚拟机器。这台虚拟机器在任何平台上都提供给编译程序一个共同接口。...编译程序只需要面向虚拟机,生成虚拟机能够理解代码,然后由解释来将虚拟机代码转换为特定系统机器码执行。...在Java,这种供虚拟机理解代码叫做字节码(即扩展名为.class文件),它不面向任何特定处理,只面向虚拟机。每一种平台解释是不同,但是实现虚拟机是相同。...Java源程序经过编译编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行字节码送给解释,解释将其翻译成特定机器机器码,然后在特定机器上运行。...Java源代码---->编译---->jvm可执行Java字节码(即虚拟指令)---->jvm---->jvm解释----->机器可执行二进制机器码---->程序运行。

53720

为什么重写equals必须重写hashCode

3、两个对象用equals比较相等,那它们hashcode相等? --- 如果我们不重写equals和hashcode,那么它使用是Object方法实现。...o.hashCode() : 0; } 为什么要重写equals 通过以上代码可以看出,Object提供equals在进行比较时候,并不是进行值比较,而是内存地址比较。...我们知道HashMapkey是不能重复,如果重复添加,后添加覆盖前面的内容。那么我们看看HashMap是如何来确定key唯一性。...0 : (h = key.hashCode()) ^ (h >>> 16); } 查看代码发现,它是通过计算Map keyhashCode值来确定在链表存储位置。...执行结果 [791675c7-28ae-4de4-abcb-9c49352d5252.png] 出现这种问题原因就是因为没有重写hashCode,导致map在计算keyhash值时候,绝对值相同对象计算除了不一致

1.6K30

Android 面试之必问Java基础

解释下Java编译与解释并存现象 当 .class 字节码文件通过 JVM 转为机器可以执行二进制机器码时,JVM 类加载首先加载字节码文件,然后通过解释逐行进行解释执行,这种方式执行速度相对比较慢...,他用于存储已被虚拟机加载类信息、常量、静态变量、即时编译编译后代码缓存等数据。...方法区存放:类信息、常量、静态变量、即时编译编译后代码。常量就存放在运行时常量池中。当类被 Java 虚拟机加载后, .class文件常量就存放在方法区运行时常量池中。...Bootstrap 类加载没有任何父类加载,如果调用String.class.getClassLoader(),返回 null,任何基于此代码抛出 NUllPointerException 异常...类加载涉及一些加载机制。 委托机制:加载任务委托交给父类加载,如果不行就向下传递委托任务,由其子类加载加载,保证Java核心库安全性。

75520

linux装载和启动可执行程序过程

-m32(目标代码) 汇编是将汇编代码转变成机器可以执行命令,每一个汇编语句几乎都对应一条机器指令 链接:gcc -o hello hello.o -m32 (可执行文件) 通过调用链接ld来链接程序运行需要一大堆目标文件...GOT表   Global Offset Table,在位置无关代码,一般不能包含绝对虚拟地址(如共享库)。...对于符号动态解析过程,我们只需要了解就是第二项和第三项,即GOT[1]和GOT[2]:GOT[1]保存是一个地址,指向已经加载共享库链表地址加载共享库形成一个链表);GOT[2]保存是一个函数地址...链接在把所需要共享库加载到内存后,并没有把共享库函数地址写到GOT表,而是延迟到函数第一次调用时,才会对函数地址进行定位。...函数,该函数找到puts函数实际加载地址,并把它写到GOT表,返回时就会进入puts函数内执行。

3K40

为什么重写equals必须重写hashCode

3、两个对象用equals比较相等,那它们hashcode相等? ---- 如果我们不重写equals和hashcode,那么它使用是Object方法实现。...o.hashCode() : 0; } 2为什么要重写equals 通过以上代码可以看出,Object提供equals在进行比较时候,并不是进行值比较,而是内存地址比较。...我们知道HashMapkey是不能重复,如果重复添加,后添加覆盖前面的内容。那么我们看看HashMap是如何来确定key唯一性。...0 : (h = key.hashCode()) ^ (h >>> 16); } 查看代码发现,它是通过计算Map keyhashCode值来确定在链表存储位置。...执行结果 出现这种问题原因就是因为没有重写hashCode,导致map在计算keyhash值时候,绝对值相同对象计算除了不一致hash值。

1K20

JavaSystem类详解

还记得你们第一个Java入门程序“hello world!”?它输出语句是:System.out.println("hello world!");请问大家对这条语句知道多少呢?...System类提供了代表标准输入、标准输出和错误输出类变量,并提供了一些静态方法用于访问环境变量、系统属性方法,还提供了加载文件和动态链接库方法。...当某个类hashCode()方法被重写后,该类实例hashCode()方法就不能唯一地标识该对象;但通过identityHashCode()方法返回hashCode值,依然是根据该对象地址计算得到...所以,如果两个对象identityHashCode值相等,则两个对象绝对是同一个对象。...当控制权从方法调用返回时,虚拟机已经尽最大努力从所有丢弃对象回收了空间。 7、exit() exit(int)方法终止当前正在运行 Java 虚拟机,参数解释为状态码。

79530

计算机组成是什么样?计算机指挥中心CPU为啥那么强大?

3.2 寻址方式 存储在寄存值可以解释为原始值或地址,解释为地址时,也有区别,比如是解释成绝对地址,还是解释成相对地址,还是解释成简单加法或乘法结果。...具体寻址方式举例如下: 立即数(或字面量):指的是指定的确切数值,通常用于将原始数字加载到寄存绝对地址:指的是内存中用指定数字表示地址,通常,它用于将绝对地址指示数据加载到寄存。...直接注册或简单地注册:指的是寄存值本身,通常用于复制一个寄存值并将其加载到另一个寄存。...间接注册:指用寄存号表示内存地址,通常,它用于将某个寄存数值解释为地址并将数据加载到内存。...程序相对地址:指向当前程序计数指向地址加上一个有符号数,这种寻址方式主要用于代码分支指令,您可以将其视为基本偏移量特例。

47520

面试专题-虚拟机篇

,使用内存称为本地方法栈(见说明) 对于热点方法调用,或者频繁循环代码,由 JIT 即时编译将这些代码编译成机器码缓存,提高执行性能 说明 加粗字体代表了 JVM 虚拟机组件 对于 Hotspot...java 对象,我们代码可以使用 从这张图可以学到 堆内存:当一个类加载对象,这个类加载对象加载所有类对象,这些类对象对应所有实例对象都没人引用时,GC 时就会对它们占用对内存进行释放...元空间中:内存释放以类加载为单位,当堆加载内存释放时,对应元空间中类元信息也释放 2....控制台 inspect 地址 指令能够查看这个地址对应对象详情 使用 javap 命令可以查看 class 字节码 代码说明 day03.loader.TestLazy - 验证类加载是懒惰...自己编写类加载就能加载一个假冒 java.lang.System ? 答案是不行。

30520

经验之谈-关于实际项目微前端优化

image (1).png 这么就会出现问题 开发: 代码量大,打包慢,包体积大,时间越长 整个系统ui主题不好管理 每一次迭代上线,影响面大 代码耦合混乱,不敢动,牵一发何止动全身 用户:访问越来越慢...,然后刷新,返回到列表页),因为浏览地址栏没有变化(push基层进行路由跳转) 每次子应用进入都是一次浏览上下文重建、资源重新加载过程。...DOM 样式可以实现样式隔离,比如qiankun.js),需要解决依赖冲突,样式冲突问题 浏览原生组件,相比第三方框架,原生组件简单直接,符合直觉,不用加载任何外部模块,代码量小(现在流行React...,Vue都是组件框架) 每个子应用需要使用 Web Components 技术编写组件或者使用框架生成 优点:面向未来技术 缺点:重构代价很大,所有的代码需要用web Components重写 Web...打开index.html可以发现,css和js文件引用使用绝对路径。但对本地磁盘来说,/指向磁盘根目录,所以找不到引用文件。需修改项目的publicPath为'.

1.4K50

静态库 VS 动态库

疑问:动态库代码是被全部加载到内存? 是的,因为动态库并不知道你程序需要使用哪个函数,所以整个动态库都会被加载到内存。 动态库工作过程 过程描述不严谨,但是它原理确实是这样。...如果没有:到硬盘上找到libc.so库,将所有代码加载(动态链接)到内存,并得到整个动态库在内存起始地址。如果有:说明之前有人已经加载过了,所以不再加载,直接得到动态库在内存起始地址即可。...printf地址 = printf相对地址 + 动态库加载地址 相对地址 编译时并不知道动态库会加载到什么位置,编译其实并不知道printf函数第一条指令绝对地址,所以编译时printf只是一个相对地址...什么是相对地址?printf函数第一条指令相对于动态库头距离。 绝对地址 动态链接加载动态库后,会得到动态库在内存起始地址绝对地址)。...printf相对地址 + 动态库绝对地址 == printf绝对地址 如此就能调用到动态库printf函数。

25910
领券