精华内容
下载资源
问答
  • 重定位动态链接 符号解析:得到E、D两个集合 重定位: 合并相同节:把E中所有相同节合并成新节 对D中定义符号确定位置:确定虚拟空间地址 对引用符号重定位:修改.text和.data节对符号引用(地址) 重定位...

    重定位和动态链接

    1. 符号解析:得到E、D两个集合
    2. 重定位:
      1. 合并相同的节:把E中所有相同的节合并成新节
      2. 对D中定义符号确定位置:确定虚拟空间地址
      3. 对引用符号重定位:修改.text和.data节对符号的引用(地址)
    3. 重定位条目:记录在.reltext 和 .reldata节
      重定位目标文件中对需要符号引用的描述(节中偏移,引用符号,重定位方式)
      1. PC相对地址:由偏移量和PC(由重定位前的值算出)确定虚内存地址
      2. 绝对地址方式:直接填引用符号的地址
    4. 可执行文件的加载:0x08048000开始加载入虚拟内存
      execve():系统调用加载可执行文件
    5. 动态链接:

      1. 静态库.a的缺点:
        1. 主存浪费:每个进程(虚存)执行库函数时都要载入主存(物理)
        2. 磁盘浪费:每个可执行文件链接时都要包含.o
        3. 库的更新影响程序,要及时编译出新的版本
      2. 共享库:.so/.dll(包含大量.o文件)
        1. 特点:主存和磁盘中均只有一份
        2. 装入或运行时:动态加载与链接

        gcc -shared -fPIC -o mylib.so myproc1.o myproc2.o
      3. 加载时过程:运行前
        1. 静态链接器链接库的重定位和符号表—>部分可执行文件(磁盘中)
        2. 部分可执行文件调用加载器—->启动动态链接器
        3. 动态链接器链接代码和数据—>完全的可执行文件(存储器中)

      4. 运行时过程:运行过程中调用动态链接器接口

    6. 动态库的位置无关代码(PIC):
      4种跳转方式

    展开全文
  • 重定位

    2012-02-14 14:54:47
    重定位有两种,分别是动态重定位与静态重定位  二、分类  1、静态重定位:即在程序装入内存过程中完成,是指在程序开始运行前,程序中各个地址有关项均已完成重定位,地址变换通常是在装入时一次

    重定位

      一、定义:重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程。他是实现多道程序在内存中同时运行的基础。重定位有两种,分别是动态重定位与静态重定位   
           二、分类
       1、静态重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故成为静态重定位。
       2、动态重定位:它不是在程序装入内存时完成的,而是CPU每次访问内存时 由动态地址变换机构(硬件)自动进行把相对地址转换为绝对地址。
       三、扩展阅读:
       重定位是由操作系统安排的。
       在装入程序前,系统会计算未使用的内存,然后将程序装入,并记下开始地址。在执行有相对地址的指令时,会将所有的地址加个刚才记下的开始地址,就叫重定位。
       重定位与EXE文件无关,它是程序装入时的一种方式。利用重定位可提高内存空间的使用率。
    展开全文
  • ELF重定位

    2018-09-18 16:57:13
    ELF重定位 首先重定位就是将符号定义和符号引用进行连接过程。可重定位文件需要包含...重定位实际上时一种给二进制文件打补丁机制,如果使用了动态链接器,可以使用重定位在内存中打热补丁。用于创建可执行...

    ELF重定位

    首先重定位就是将符号定义和符号引用进行连接的过程。可重定位文件需要包含描述如何修改节内容的相关信息,从而使得可执行文件和共享目标文件能够保存进程的程序镜像所需要的正确信息。重定位条目就是我们上面说的相关信息。
    重定位记录保存了如何对给定的符号对应代码进行补充的相关信息。重定位实际上时一种给二进制文件打补丁的机制,如果使用了动态链接器,可以使用重定位在内存中打热补丁。用于创建可执行文件和共享库的链接程序/bin/ld,需要某种列席的元数据来描述如何对特定的指令进行修改,这种元素数据就放在前面说的重定位记录中。
    假设将2个目标文件链接到一起产生一个可执行文件。一个obj1.o文件中存放了调用函数fun()的代码,而fun()定义在obj2.o中。链接程序会对obj1.o和obj2.o中的重定位记录进行分析并将这两个文件链接在一起产生一个可独立运行的可执行程序。符号引用会被解析成符号定义。目标文件中的代码会被重定位到可执行文件的段中一个给定的地址。在进行重定位之前,无法确定obj1.o或者obj2.o中的符号和代码在内存中的位置,无法进行引用。只能在链接器确定了可执行文件的段中存放的指令或者符号的位置之后才能进行修改。

    重定位结构:

    typedef struct
    {
    	Elf64_Addr r_offset;
    	Uint64_t r_info;
    	int64_t r_addend;
    }Elf64_Rel;
    

    r_offset 指向需要进行重定位操作的位置。
    r_info指定必须对其进行重定位的符号表索引以及要应用的重定位类型。
    r_addend指定常量加数,用于计算存储在可重定位字段中的值。
    32位ELF文件的重定位记录跟64位一样,不过用的时32位的整型。指定常量加数分为隐式加数和显式加数进行存储。 不包含r_addend就需要隐式加数。这时隐式加数存储在重定位目标本身中。64位的可执行文件一般使用ElfN_Rela的结构显示地对加数进行存储。
    比如隐式加数e8 fc ff ff ff call 7数字7就是要进行修改的重定位目标偏移量,当链接器产生一个可执行文件,链接器会对偏移量位7的位置重定向,随后,当此函数被包含进了可执行文件之后,链接器会对偏移进行补齐4字节,这样就相当于存储了这个函数实际偏移地址。

    R_386_PC32类型重定位

    每一种重定位类型都对应一种计算方式,这种入下:
    他的计算方式是“S+A-P”的方式重定位目标。
    S是所以位于重定位条目中0符号的值(比如真正函数定义的地址)。
    A是重定位条目中的加数。(比如补齐4字节)。
    P是要进行重定位(使用r_offset进行计算)的存储单元的地址(节偏移或者地址)。(比如就是call之后的函数地址)
    所以要将一个偏移量计算成虚拟地址,可以利用下面公式:
    address_of_call(这个就是call这条指令的地址了,不是call后的地址)+offset+5(5是调用指令的长度)
    用下面的计算也可以将一个地址转换成偏移量:
    address-address_of_call-4(4是调用指令立即操作数的长度,为32位)

    展开全文
  • <p>I working on using golang builded shared library in python script(ctypes loadlibrary) on alpine based container. <h2>But it is failed as follows, <p>/usr/src/app # <strong>go build -o cc.so...
  • 链接二( 重定位)

    2020-05-16 11:47:45
    对D中定义的符号重定位(确定新节中所有定义符号在虚拟地址空间中地址) 对引用符号重定位(修改.text、.data节中对每个符号引用,需要用到.rel_data、.rel_text中保存的重定位信息) ①重定位信息 ...

    目录

     

    链接二( 重定位&&动态链接)

    1.重定位过程

    2.重定位信息

    3.图解过程:

    4.R_386_PC32的重定位方式

    5.R_386_32的重定位方式

     ​​​


    链接二( 重定位&&动态链接)

    1.重定位过程

    可重定位文件 = 用到.o文件的集合E+ 定义符号的集合D

    • 将E中所有目标模块中相同的节合并
    • 对D中定义的符号重定位(确定新节中所有定义符号在虚拟地址空间中的地址)
    • 对引用符号重定位(修改.text、.data节中对每个符号的引用,需要用到.rel_data、.rel_text中保存的重定位信息)、

     

    2.重定位信息

    汇编器遇到引用时,生成一个重定位条目。数据引用的重定位条目在.rel_data中,指令中引用的重定位条目在.rel_text中(下图的两处在.rel_text)。ELF中重定位条目的格式:

    typedef struct {
    int offset;/*节内偏移*/
    int symbol:24, /*所绑定符号*/
    type: 8;/*重定位类型*/
    } EIf32_ Rel;
    

    IA_32重定位类型:R_386_32绝对地址,R_386_PC32: PC相对地址

     

    3.图解过程:

    swap:

    符号解析时:初始化为fc ff ff ff (小端法即-4)生成重定位条目(.rel_text中):

    • 偏移量:7字节
    • 方式:PC相对地址
    • 符号:swap

    main.o符号表中最后三个条目:

    swap是未定义的符号,而且是全局符号,在其他模块中定义的。

    为什么是-4?PC的值是下一条指令的值

     

    4.R_386_PC32的重定位方式

    ①假定:

    • 可执行文件中main函数对应机器代码从0x8048380开始
    • swap紧跟main后,其机器代码首地址按4字节边界对齐

    ②则swap起始地址为多少?

    • 0x8048380+0x12 =0x8048392
    • 在4字节边界对齐的情况下,是0x8048394

    重定位值=ADDR(r_sym)-( ( ADDR(.text) + r_offset )- init )

    • call后面即main函数入口地址
    • PC相对地址方式
    • main函数地址=当前PC值(执行call时)+偏移量(重定位值)
    • PC(eip)是call指令下一条指令的地址:PC=addr(main)+0x7-init(-4)=0x804838b
    • 重定位后值=目标地址-PC=0x8048394-0x804838b=0x9
    • call指令机器代码e0 09 00 00 00

     

    5.R_386_32的重定位方式

    ①.data中

     

    在swap.c中全局变量bufp0用buf[0]初始化,是buf的引用,但是buf定义在main.c中,因此发生重定位。main.c中buf是一个确定的值,不需要重定位。.rel_data有一个表项:r_offset=0,r_sym=9,r_type=R_386_32

    • 假定:buf在运行时的存储地址ADDR(buf) =0x8049620
    • 重定位后, bufp0的地址及内容变为什么?
      buf和bufp0同属于.data节,故在可执行文件中它们被合并
      bufp0紧接在buf后,故地址为0x8049620+ 8= 0x8049628
    • 因是R 386 32方式,故bufp0内容为buf的绝对地址0x8049620,即“20 96 04 08”
       

    ②.text节中

    buf和bufp0的地址分别是0x8049620和0x8049628,&buf[1](C处重定位值)为0x8049620+ 0x4=0x8049624,bufp1的地址就是链接合并后.bss节的首地址,假定为0x8049700。
     

    a.bufp1=&buf[1]

    6:c7 05 00 00 00 00     movl $0x4,0x0
    C:04 00 00 00
                            8:R_386_32 .bss
                            c:R_386_32 buf
    
    • bufp1、buf都是引用,movl指令源操作数,目的操作数都需要重定位。
    • 初始值为0x4:编译的时候根据引用buf的索引为1设定。
    • (bufp1)8:00 97 04 08
    • (&buf[1])c:24 96 04 08

    b.temp=*bufp0

    10:a100000000,mov 0x0,%eax
                    11:R_386_32 bufp0
    15:8b 00       mov (%eax),%eax
    17:89 45 fc    mov %eax,-0x4(%ebp
    
    • bufp0是引用,要重定位。
    • 11 (bufp0) : 28 96 04 08
       

    c.*bufp0=*bufp1

    1a:a1 00 00 00 00       mov 0x0, %eax
                            1b: R_386_32 bufp0
    1f:8b 15 00 00 00 00    mov 0x0 %edx
                            21:R_386_32 .bss
    25:8b 12                mov (%edx),%edx
    27:89 10                mov %edx,(%eax)
    
    • bufp0、bufp1都是引用,需要重定位。
    • 1b (bufp0) : 28 96 04 08
    • 21 (bufp1) : 00 97 04 08
       

    d.*bufp1=temp

    29:a1 00 00 00 00  mov 0x0,%eax
                       2a: R_386_32 .bss
    2e:8b 55 fc        mov -0x4(%ebp),%edx
    31:89 10           mov %edx,(%eax)
    
    • bufp1是引用,需要重定位
    • 2a (bufp1) : 00 9704 08

    展开全文
  • PE加载重定位

    2017-04-07 10:19:27
    PE exe文件加载有时候会重定位,主要是因为 FILEHEADER中一个字段  Characteristics  这个域描述pe文件一些属性信息,比如是否可执行,是否是一个动态连接库等.具体定义如下: #define IMAGE_FILE_...
  • dll基地址重定位

    2019-07-10 22:07:35
    基地址重定位:当进行多个dll动态库合起来编译成一个exe文件时候,每个dll和exe都有默认基地址,当加载器加载exe时候,其实某个dll会发生基地址改变,因此当加载完后,之前dll里面指令和加载之后不一样...
  • g++/ld中符号重定义

    千次阅读 2015-04-03 19:42:23
    gcc/ld可以链接三种类型重定位目标文件,分别是目标文件(.oxx)、静态链接库(.a)和动态链接库(.so)。把a.c和b.c编译成不同文件类型,其链接结果不同。 二、举个例子 head.h#include using namespace ...
  • ELF文件-重定位

    2020-10-04 20:46:26
    然而在编写程序过程中,只需要指明所要调用函数名(即符号引用)即可,然后,在重定位过程中,动态链接器会把函数名与函数实际所在地址(即符号定义)联系到一起,使得程序能够知道应该跳转到哪里去;重定位文件必须知道...
  • 其中可重定位目标文件有三种,分别是目标文件(.o)、静态链接库(.a)和动态链接库(.so)。 本文所指普通目标文件特殊“目标文件(.a)” 二、什么是符号 1.符号是指代码中变量与函数。代码中关键字不...
  • 静态链接 静态链接就是在程序运行前,链接器通过对象文件中包含的重定位表,完成所有重定位操作,并最终形成一个在运行时不需要再次进行依赖库加载和重定位操作(因为所有依赖库在运行前都被链接到程序中了)。...
  • 绝不重定义继承函数默认参数

    千次阅读 2010-11-04 08:57:00
    然而,重新定义一个继承非虚函数总是一个错误,所以我们把我们讨论定位在继承一个虚函数,而且这个虚函数有默认参数值。原因很简单:虚函数是动态绑定,但是默认参数值是静态绑定。静态绑定意味着早期绑定,...
  • 动态链接过程

    2020-04-16 18:04:38
    可执行目标文件 ...重定义符号引用(依赖于重定位条目) 动态链接: 1.生成共享库文件 gcc -shared -fpic -o libvector.so 1.c 2.c 2.生成一个可执行目标文件(部分链接) gcc -o p1 1.c ./li...
  • 昨天由于姿势检测程序用到0pencv1.2中才定义的宏(Opencv1.0中没有)会有更好效果,但是Opencv1.2在VC6.0之下总是不能编译通过,所以就想着装个更高版本VS,一开始先装VS2008,但是试过一个下午加半个晚上试过...
  • 主模块是第一个载到内存中,运行时不会再进行地址的重定位,所以链接时就要确定所有引用全局变量地址。主模块为所有引用全局变量产生一个副本,包括定义在其他共享模块中全局变量。当共享模块发现主模块中有...
  • 隐式导入: l 即在程序指定链接.lib(可以...l 通过.lib文件在可执行程序中生成DLL的重定位表(含DLL名称、导入函数名表(存放导入函数名,在生成可执行程序后就建立)、DLL中导出函数地址映射表(此地址在
  • 动态链接共享库

    2016-12-13 19:14:22
    像Unix ld程序这样静态连接器以一组可重定位目标文件和命令行参数作为输入,生成一个完全连接可以加载和运行可执行目标文件作为输出。为了构造可执行文件,连接器必须完成两个任务。1.符号解析 目标文件定义...
  • 一个epoll.c源文件,需要经过预处理器,编译器,汇编器和链接器处理后输出可执行...预处理器执行头文件和宏定义的简单替换,而编译器和汇编器生成可重定位目标文件(包括共享目标文件),链接器生成可执行目标文件。
  • 4.2.1重定位的定义 4.2.2动态重定位的实现 4.2.3动态重定位分区分配算法 4.3内存信息的保护 4.3.1上界/下界寄存器 4.3.2基址/限长寄存器 4.4内存地址转换 4.4.1逻辑地址 4.4.2物理地址 4.4.3地址映射 五 ...
  • 作为一名C/C++程序员,对于编译链接的过程要了然于胸。首先大概介绍一下,编译分为3步,首先对源文件进行预处理,这...最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重定位的二进制...
  • 多个可重定位目标模块 + 静态库(标准库、自定义库) 静态库 在类Unix系统中,静态库文件采用一种称为存档档案(archive)特殊文件格式,使用.a后缀。 使用静态库,可增强链接器功能,使其能通过查找一个或多个...
  • 最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重定位的二进制目标文件。以上就是编译的过程,下面主要介绍两种链接方式--静态链接和动态链接。 静态链接和动态链...
  • 早就听说C++难就难在它内存管理,new和delete使用一不小心轻则内存泄漏,则损坏堆内存抛出异常。C++异常不同于一般bug,定位和跟踪颇为困难,最近我在做《C++ Primer Plus 5th Edition》第12章第2道...
  • 链接是将多个可重定位目标文件合并到一个目标文件过程。链接由链接器完成,链接器重要完成两个任务: 1、符号(符号表由汇编器构造)解析。也就是将符号引用和符号定义关联起来。其中符号定义和符号引用可能不在...
  • 动态链接与静态链接

    2016-11-09 10:24:51
    静态链接静态链接是将...扫描时候修改三个集合(可重定位目标文件集合E,未解析符号集合U,已定义的符号集合D)。扫描目标文件时候,修改集合U和集合D,扫描归档文件就会尝试匹配U中未定义符号,匹配成功修改U
  • 静态链接和动态链接

    2019-02-14 14:00:44
    首先大概介绍一下,编译分为3步,首先对源文件进行预处理...最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重定位的二进制目标文件。以上就是编译的过程,下面主要介绍两种链接方式--...
  • 连接器读取可重定位对象文件集合,然后链接它们,输出在一个可执行文件中。英文:The linker reads a collection of relocatable object files and links them together into an output executable file. 2 ...
  • 最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重定位的二进制目标文件。 由于每个文件都是独立编译的,即每个.c文件都会编译成一个.o文件目标文件,由于C文件之间存在依赖关系,为了...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 334
精华内容 133
关键字:

动态重定位的定义