首页 > 其他分享 >静态库lib.a结构简介

静态库lib.a结构简介

时间:2024-05-31 19:30:46浏览次数:24  
标签:文件 LIB lib 静态 简介 libmath int add ar

静态库文件是使用打包工具ar将一个或者多个可重定位的目标文件组成一个静态库文件,也可以看做是多个可重定位的目标文件的一个简单包装文件。

1. 静态库的生成

假设我们要构建一个四则运算的而函数库

(1)其源代码如下:

[root@localhost liba]# cat add.c
int
add (int a, int b)
{
  return a + b;
}

[root@localhost liba]# cat sub.c
int
sub (int a, int b)
{
  return a - b;
}

[root@localhost liba]# cat mult.c
int
mult (int a, int b)
{
  return a * b;
}

[root@localhost liba]# cat div.c
int
div (int a, int b)
{
  int d = a / b;
  return d;
}

(2) 构建Makefile

[root@localhost liba]# cat Makefile
AR = ar
STATIC_LIB = ./libmath.a
DYNAMIC_LIB = ./libmath.so
objects = add.o sub.o mult.o div.o
pic_objects = add.o sub.o mult.o div.o

all: $(STATIC_LIB) $(DYNAMIC_LIB)

obj: $(objects)

$(objects): %.o: %.c
        $(CC) -c $(CFLAGS) $< -o $@

$(pic_objects): %.o: %.c
        $(CC) -c $(CFLAGS) -fpic $< -o $@

$(STATIC_LIB) : $(objects)
        $(AR) rcs $@ $^

$(DYNAMIC_LIB): $(pic_objects)
        $(CC) -shared -o $@ $^

clean:
        rm -f $(objects)
        rm -f $(STATIC_LIB) $(DYNAMIC_LIB)

(3) 编译生成libmath.a静态库文件

执行make all,生成libmath.a和libmath.so。

[root@localhost liba]# make all

 2. 静态库文件的基本结构

    静态库的结构在/usr/include/ar.h文件中描述了ar文件结构中的几个重要数据结构,从中可以分析出ar文件的结构主要包括两大部分:

(1)存档文件的魔数

存档文件的魔数(Magic Number)标识ARMAG,也可以看做是ar文件的首部,该首部是一个8字节的字符序列,其定义为:

#define ARMAG   "!<arch>\n"     /* String that begins an archive file.  */

魔数ARMAG的字节大小SARMAG,其值为整数值8,其定义为:

#define SARMAG  8               /* Size of that string.  */

(2)每个成员文件的相关信息

每个成员文件的信息包括也两部分:

A. 成员文件首部

使用struct ar_hdr结构体来描述该成员文件的基本信息,包括文件名称、日期、用户ID、组ID、文件存取属性、文件大小以及一个结构体结束标记。该结构体的定义如下:

#define ARFMAG  "`\n"           /* String in ar_fmag at end of each header.  */

struct ar_hdr
  {
    char ar_name[16];           /* Member file name, sometimes / terminated. */
    char ar_date[12];           /* File date, decimal seconds since Epoch.  */
    char ar_uid[6], ar_gid[6];  /* User and group IDs, in ASCII decimal.  */
    char ar_mode[8];            /* File mode, in ASCII octal.  */
    char ar_size[10];           /* File size, in ASCII decimal.  */
    char ar_fmag[2];            /* Always contains ARFMAG.  */
  };

B.成员文件的内容

如果ar文件是静态库,那么该部分内容就是构造这个静态库的可重定位目标文件(也就是我们常见的o文件)的内容。

​图 1.  使用ar工具打包的静态库格式

3. 静态库文件的索引部分

如果在ar打包时使用-s参数,则在ar文件中会添加一个索引部分,索引部分的组织与其他成员文件的组织方式相同,索引成员文件首部中的ar_name的值为“/              ”。

也可以使用nm查看该索引内容。


[root@localhost liba]# nm --print-armap libmath.a

Archive index:
add in add.o
sub in sub.o
mult in mult.o
div in div.o

add.o:
00000000 T add

sub.o:
00000000 T sub

mult.o:
00000000 T mult

div.o:
00000000 T div

索引成员文件的内容一般包括:

(1)符号数量

(2)每个符号所在的成员文件在整个ar文件中的偏移量

(3)所有符号的名称列表

上述libmath.a文件的具体内容分析如下:

 图2. libmath.a 结构图示

也可以使用hexdump查看具体内容。


参考文献

[1] Executable and Linkable Format (ELF) - eLinux.org

[2] ELF - OSDev Wiki

[3] Understanding the ELF File Format

[4] The 101 of ELF files on Linux: Understanding and Analysis

[5] www.skyfree.org/linux/references/ELF_Format.pdf

[6] ELF:From The Programmer's Perspective

标签:文件,LIB,lib,静态,简介,libmath,int,add,ar
From: https://blog.csdn.net/Lazy_Linux/article/details/139355555

相关文章

  • java.lang.UnsatisfiedLinkError: no taos in java.library.path, TDengine 访问数
     TDengine linux部署连接驱动问题: java.lang.UnsatisfiedLinkError:notaosinjava.library.path解决方案有有两种:方法一:使用原生的连接需要安装客户端,docker应用的话需要安装tdengine客户端到相应应用容器里面:windows端的需要安装tdengine客户端注意使用driver驱动......
  • 函数式API简介
    函数式API简介转自:https://www.cnblogs.com/miraclepbc/p/14312152.html导入相关库以及数据加载相关库导入:importtensorflowastffromtensorflowimportkerasimportmatplotlib.pyplotasplt%matplotlibinline数据加载:fashion_mnist=keras.datasets.fashion_mni......
  • MySQL - binlog日志简介及设置
    基本概念binlog是Mysqlsever层维护的一种二进制日志,与innodb引擎中的redo/undolog是完全不同的日志;其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,记录了所有的DDL和DML(除了数据查询语句)语句,并以事务的形式保存在磁盘中,还包含语句所执行的消耗的时间,MySQL的二进制......
  • 防止浏览器缓存了静态的配置等文件(例如外部的config.js 等文件)
    防止浏览器缓存了静态的配置文件前言1、在script引入的时候添加随机数1.1、引入js文件1.2、引入css文件2、通过html文件的<meta>设置防止缓存3、使用HTTP响应头:前言在实际开发中浏览器的缓存问题一直是一个很让人头疼的问题,尤其是我们打包时候防止的静态配置文件con......
  • Python使用Matplotlib和Seaborn绘制箱线图
    目录一、箱线图定义二、Matplotlib与Seaborn简介三、绘制箱线图的样例数据四、Python绘制箱线图4.1Matplotlib绘制箱线图4.2Seaborn绘制箱线图五、参考文献一、箱线图定义  箱形图(Boxplot),又称盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分布情况的......
  • python-argparse用法简介
    1.argparse介绍argparse是Python标准库中用于解析命令行参数的模块。它提供了一种简洁而灵活的方式来处理命令行参数,包括选项(可选参数)和位置参数(必需参数)2.argparse基本使用点击查看代码importargparse#1.创建ArgumentParser对象,在创建ArgumentParser对象时,可以传入......
  • DeerOJ的前端框架介绍-libs文件夹和controller文件夹
    libs文件夹在index.php文件初始化的过程中,需要提前准备好一些类和方法,这些类和方法的初始化是调用libs文件夹下的大多数php文件来实现的。libs文件夹下的文件如下:其中,uoj-lib.php文件是进行所有相关初始化的主文件,上级的index.php文件会直接调用该文件展开初始化的工......
  • newlib 库介绍和学习
    介绍官网https://sourceware.org/newlib/github代码https://github.com/mirror/newlib-cygwin官网简介Newlib是一个用于嵌入式系统的C库。它是几个库部分的集合,所有这些部分都在免费软件许可证下,使它们可以在嵌入式产品上轻松使用。Newlib仅以源代码形式提供。它可以为广......
  • matplotlib
    mat—matrix矩阵plot—画图lib—library库matlab矩阵实验室mat—matrix矩阵lab实验室一、matplotlib三层结构1.容器层画板层Canvas画布层Figureplt.figure()绘图层/坐标系axesplt.subplots()axis坐标轴2.辅助显示层3.图像层图像......
  • Python库之Playwright简介、安装、使用方法详细攻略
    Python库之Playwright简介、安装、使用方法详细攻略引言在自动化测试领域,Playwright是一个强大的库,它支持无头浏览器自动化,允许开发者在多种浏览器上进行网页自动化操作。Playwright由微软开发,支持Chromium、Firefox和WebKit,能够模拟真实用户的浏览器行为。Playwright简......