静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释
#1. 如何使用静态库
制作静态库
(1)gcc *.c -c -I../include得到o文件
(2)
ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库中,c创建静态库,不管库是否存在,s写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。
mv libMyTest.a ../lib 将静态库文件放置lib文件夹下
nm libMyTest.a 查看库中包含的函数等信息
第一种方法:
gcc + 源文件 + -L 静态库路径 + -l静态库名 + -I头文件目录 + -o 可执行文件名
gcc main.c -L lib -l MyTest -I include -o app
./app
第二种方法:
gcc + 源文件 + -I头文件 + libxxx.a + -o 可执行文件名
gcc main.c -I include lib/libMyTest.a -o app
#2. 如何使用动态库
动态库制作:
gcc -fPIC *.c -I ../include -c 参数-fPIC表示生成与位置无关代码
第一种方法:
gcc + 源文件 + -L 动态库路径 + -l动态库名 + -I头文件目录 + -o 可执行文件名
gcc main.c -L lib -l MyTest -I include -o app
./app
(执行失败,找不到链接库,没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径)
使用命令ldd app可以查看当前的链接库情况
第一种方法:
export LD_LIBRARY_PATH=自定义动态库的路径
(只能起到临时作用,关闭终端后失效)
LD_LIBRARY_PATH : 指定查找共享库(动态链接库)时除了默认路径之外的其他路径,该路径在默认路径之前查找
第二种方法:
将上述命令写入home目录下的.bashrc文件中,保存后重启终端生效(永久)
第三种方法:
直接将动态库拷贝到user/lib的系统目录下(强烈不推荐!!)
第四种方法:
将libmytest.so所在绝对路径追加入到/etc/ld.so.conf文件,使用sudo ldconfig -v 更新
第二种方法:
gcc + 源文件 + -I头文件 + libxxx.so + -o 可执行文件名
gcc main.c -I include lib/libMyTest.so -o app
(执行成功,已经指明了动态库的路径)
#3. nm可以列出ELF文件的符号,变量
1. 不论一个静态变量是定义在函数内的,或是函数外的,其在程序段中的分配方式是一样的。
如果这一静态变量是初始化好的,那么被分配在.data段中,否则被分配在.bss段中。
2. 非静态的全局变量,其所分配的段也是只与其是否被初始化有关。如果是初始化了的全局变量其将被分配在.data段中,
否则是.bss段中。
3. 函数无论是静态还是非静态的其总是被分配在.text段的,但T(t)的大小写表示了这一符号所对应的函数是否是静态函数。
4. 函数内的局部变量并不被分配在.data .bss 和 .text段中,分配在栈,nm看不出信息
代码段 -------.text 可执行代码段,用来放代码
-------.rodata 只读数据段,如const修饰符, (归类到.text中)
数据段
-------.data 初始化数据段,用来放初始化好的数据,.idata 归类到.data段中
--------.bss 未初始化数据段,用来放未初始化好的数据
+-------------+-----------
| .bss |
+-------------+-- 数据段
| .data |
+-------------+-----------
| .rodata |
|_____________| 代码段
| .text |
+-------------+-----------
#4. objdump -h a.out
Idx Name Size VMA LMA File off Algn
23 .data 00000010 0000000000601030 0000000000601030 00001030 2**3
CONTENTS, ALLOC, LOAD, DATA
24 .bss 00000008 0000000000601040 0000000000601040 00001040 2**0
ALLOC
25 .comment 0000002b 0000000000000000 0000000000000000 00001040 2**0
CONTENTS, READONLY
VMA (Virtual Memory Address,虚拟内存地址) 指示的段在程序运行时的开始地址
LMA(Load Memorry Address,加载内存地址) 指段的存放首地址
File off 指示每一个段在代码文件中的存储位置
DWARF(Debugging With Attributed Record Formats) refers to www.dwarfstd.org(objdump -W a.out)
objdump -d a.out 反汇编,显示程序的汇编代码
objdump -S -d a.out 反汇编,同时显示C\C++源程序和与之对应的汇编代码, 此时加上--demangle可增加可读性
objdump -f 显示目标文件的头信息,主要是start address
objdump -s -j .data a.out 查看某一个段中的具体内容
#5. objcopy
objcopy -j .text -j .data -j .bss a.out onlytest 提取多个段内容到onlytest
objcopy --strip-debug a.out; 类似strip工具,将程序中的调试信息去除
#6 size a.out
size -A a.out
#7. strings a.out 查看可显示的字符串
#8. strip 去除程序文件中的调试信息以便减小文件的大小, 与objcopy --strip-debug功能一样
#9. ranlib 在档案中生成文件索引。 ar的s参数也具有同样功能, 对文件存取速度更快。
静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释的更多相关文章
- C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项
目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...
- C++开发新版本vs使用旧版本vs编译的静态库动态库
关于vs潜在的升级问题概述 (Visual C++)查看官网的介绍:潜在的升级问题概述 (Visual C++).主要问题: 1. 如果使用 /GL(全程序优化)进行编译,则生成的对象文件只能使用生成 ...
- linux静态与动态库创建及使用实例
一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...
- Linux中创建和使用静态库&动态库
库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...
- 生成lua的静态库.动态库.lua.exe和luac.exe
前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...
- Linux 静态库&动态库调用
1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...
- windows库的创建和使用:静态库+动态库
windows库的创建和使用:静态库+动态库 一.静态库的创建和使用 1. 静态库创建 (1)首先创建projecttest,測试代码例如以下: 1) test.h void test_print ...
- binutils工具集之---addr2line
addr2line用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号. 在不少嵌入式开发环境中,编译器的名称往往不是gcc,而是想arm-rtems-gcc这样的,对于这种命名形式的编译器 ...
- linux下 GCC编译链接静态库&动态库
静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...
随机推荐
- vim实用插件
转载:Vim 实用插件推荐(2017) - 知乎 (zhihu.com) 1.插件管理器 ----------------------------------------- Vundle.vim - ...
- SVN查看项目修改记录及修改内容
工具/原料 svn 一,查看修改记录 1 选择要查看的文件夹,打开之后在空白的地方右键. 2 选择svn里面的"查看日志".show_Log 3 在弹出的日志框里,可以看到,你可以 ...
- 三层组网AP上线外接DHCP
一.实验目的 在3-1的基础上增加DHCP的配置方法 二.实验仪器设备及软件 仪器设备:一台AC,四台AP,一台路由充当DHCP服务器 软件:ENSP 三.实验原理 四. 实验内容与步骤 1.三层 ...
- Laravel 中输出 SQL 语句的到 log 日志
在 AppServiceProvider.php 中的 boot 方法中添加如下代码 即可 public function boot() { //数据库监听 DB::listen(function ( ...
- Qt 使用大神插件快速创建树状导航栏
前言 本博客仅仅记录自己的采坑过程以及帮助网友避坑,方便以后快速使用自定义控件,避免重复出错. 下载插件 大神 Github Qt 自定义控件项目地址:https://github.com/feiya ...
- JMeter接口自动化发包与示例
JMeter接口自动化发包与示例 近期需要完成对于接口的测试,于是了解并简单做了个测试示例,看了看这款江湖上声名远播的强大的软件-Jmeter靠不靠谱. 官网:https://jmeter.apach ...
- JAVA POI导出EXCEL 动态表头、多级表头、动态数据
导出Excel文件是业务中经常遇到的需求,以下是经常遇到的一些问题: 1,导出中文文件名乱码 String filename = "sheet1";response.setChar ...
- Calendar.set方法获取前一天的当前时刻
获取前几天的当前时刻的时间方法 Calendar cal = Calendar.getInstance(); Date date = new Date();// 获取当前时间 cal.setTime( ...
- 华为开发者大会主题演讲:3D建模服务让内容高效生产
内容来源:华为开发者大会2021 HMS Core 6 Graphics技术论坛,主题演讲<3D建模服务使能3D内容高效生产>. 演讲嘉宾:华为消费者云服务 AI算法专家 3D建模服务(3 ...
- Solon 1.5.67 发布,增加 GraalVm Native 支持
Solon 已有120个生态扩展插件,此次更新主要为细节打磨: 添加 solon.extend.graalvm 插件,用于适配 graalvm native image 模式 从此,solon 进入 ...