linux静态链接

本文介绍了Linux环境下静态链接的基本概念,详细阐述了ELF文件的结构和作用,包括不同类型的段。重点讲解了静态编译链接过程中地址和空间的分配、符号决议及重定位的过程。此外,还探讨了静态库链接的工作原理。
摘要由CSDN通过智能技术生成

基本概念

预编译—>编译—>汇编—>链接

宏定义代替,预编译命令,文本去注释—>.S—>.O—>ELF

文本变成中间文件, 也就是编译+汇编的过程:

词法分析,语法分析,语义分析,中间过程优化

ELF文件

ELF是一种二进制可执行文件.

目标文件(*.obj)和最终可执行文件(ELF格式)统称为ELF文件.

另外*.a *.so coredump文件也都是ELF文件的不同类型.

ELF文件格式解析

最重要的是,数据是分段存储,不同段的有不同的功能.段的类型:
Screenshot from 2019-01-18 16-31-09-4af7c91a-c88c-4640-953e-113a0cfa0550

为了后面装载的方便,段在链接期间,是可以合并,优化空间的,

例子

以a.c, b.c为例子:

//in a.c
#include <stdio.h>
extern int shared;
int main(int argc, char* argv[])
{
   
        int a = 100;
        swap(&a, &shared);
        printf("shared %d\n", shared);
        return 0;
}

//in b.c
int shared = 99;
void swap(int* a, int* b) 
{
   
        int tmp = *a;
        *a = *b;
        *b = tmp;
}

编译(包含中间文件):

gcc a.c b.c -c -o ab

查看所有elf信息:

➜  compile-link-lib readelf -a ab
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x5a0
  Start of program headers:          64 (bytes into file)
  Start of section headers:          6584 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:         29
  Section header string table index: 28

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .interp           PROGBITS         0000000000000238  00000238
       000000000000001c  0000000000000000   A       0     0     1
  [ 2] .note.ABI-tag     NOTE             0000000000000254  00000254
       0000000000000020  0000000000000000   A       0     0     4
  [ 3] .note.gnu.build-i NOTE             0000000000000274  00000274
       0000000000000024  0000000000000000   A       0     0     4
  [ 4] .gnu.hash         GNU_HASH         0000000000000298  00000298
       000000000000001c  0000000000000000   A       5     0     8
  [ 5] .dynsym           DYNSYM           00000000000002b8  000002b8
       00000000000000c0  0000000000000018   A       6     1     8
  [ 6] .dynstr           STRTAB           0000000000000378  00000378
       000000000000009f  0000000000000000   A       0     0     1
  [ 7] .gnu.version      VERSYM           0000000000000418  00000418
       0000000000000010  0000000000000002   A       5     0     2
  [ 8] .gnu.version_r    VERNEED          0000000000000428  00000428
       0000000000000030  0000000000000000   A       6     1     8
  [ 9] .rela.dyn         RELA             0000000000000458  00000458
       00000000000000c0  0000000000000018   A       5     0     8
  [10] .rela.plt         RELA             0000000000000518  00000518
       0000000000000030  0000000000000018  AI       5    22     8
  [11] .init             PROGBITS         0000000000000548  00000548
       0000000000000017  0000000000000000  AX       0     0     4
  [12] .plt              PROGBITS         0000000000000560  00000560
       000000000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值