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

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

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

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

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

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

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

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

相关·内容

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

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

54430

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

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

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

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

    72910

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

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

    80730

    Java常用API

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

    1.1K40

    Java高质量面试总结

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

    47311

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

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

    47700

    java面试题汇总-基础篇

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

    80610

    【Linux】动静态库

    一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接...方案三 在与可执行程序同一路径下,建立软链接 四.动静态库的加载问题 4.1静态库的加载问题 静态库需要加载吗?不需要,静态库一般不考虑程序加载过程。...我们学过,代码在编译的时候内部就存在地址,这个地址是虚拟地址,所以这些实现方法会被拷贝进虚拟地址中的代码块,等待加载到内存中时,也会被拷贝到程序地址空间的代码块,这时,我们调用的静态库中的函数就和我们自己实现的函数完全一样了...当一个使用了动态库的进程A运行起来以后在需要动态库a时,操作系统会先在内存中搜寻a,是否存在,如果存在,就直接将a通过页表进行映射进进程A的进程地址空间中的共享区中,如果不存在就会将磁盘中的动态库a加载进入内存...我们知道被编译好的程序内部是有地址的!动态库内部的地址并不是绝对地址,而是偏移量!

    9110

    Java面向对象特性总结

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

    48910

    为什么重写equals必须重写hashCode

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

    1.7K30

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

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

    55820

    JVM之JVM初探

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

    51410

    为什么重写equals必须重写hashCode

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

    1K20

    Android 面试之必问Java基础

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

    82920

    Java中System类详解

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

    85730

    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函数内执行。

    3.1K40

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

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

    52420

    面试专题-虚拟机篇

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

    32420

    当creator遇上protobufjs—叛逆成长

    继续追踪问题,从下图的代码m.deps[request]中查看到fs与path的值都是等于2。 ?...如果这样去实现protobufjs的fetch函数,只能是异步加载,而我之前给pbkiller的范例都是同步加载!眼前一黑,回过神来,绝对不能用这种方法坑了我的插件用户。 3....我可以要在运行时修改protobufjs中的关键函数,将其中的具体实现自己重写一次不就行了吗? 这样从物理表面上并没有修改源码,同时又可解决同步异步问题。...三、逆境成长 经过上面对现状、问题、策略、步骤的自问自答,解决方法跃然纸上。看到这里有人可能会问,这不是四象限法法吗? 1. 四象限法 说实话最早我也不知道四象限法,它是这个周未我刚学到的新知识。...当知道这种思考解决问题的方法时,我立刻就想起解决protobufjs在creator1.7模拟器上的问题,当时我不正是用的这种解决问题的吗?

    68030
    领券