程序的加载和链接

 

 

 

hello.h

 #ifndef HELLO_H
 #define HELLO_H

 void hello(const char *name);

 #endif //HELLO_H

 

hello.c

#include <stdio.h>
 
void hello(const char *name) {
    printf("Hello %s!\n", name);
}

 

main.c

#include "hello.h"
 
int main() {
    hello("everyone");
    return 0;
}

 

 

生成 .o 文件

gcc -c hello.c

 

 

 

生成静态库文件

ar cr libmyhello.a hello.o
gcc -o hello main.c -L. -lmyhello
./hello
Hello everyone!

 

 

 

 

生成动态库

gcc -shared -fPIC -o libmyshare.so hello.c
gcc -o hello main.c -L. -lmyhello
./hello
结果
./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory
用strace 运行hello能看到在指定目录下找不到文件,将libmyshare.so拷贝到/usr/lib64目录下
再运行./hello就正常了

 

 

 

 

 

 

一些相关的命令

名称含义
ar创建静态库,插入删除列出和提取成员
ldd列出一个可执行文件在运行时所需要的共享库
gcc强大的编译工具
nm列出一个目标文件的符号表中定义的符号
size列出目标文件中section的名字和大小
objdump

所有二进制工具之母

能够显示一个目标文件中所有的信息

最大的作用是反汇编.text 片段中的二进制指令

readelf

显示一个目标文件的完整结构

包括ELF头中编码的所有信息,包含size和nm的功能

strace跟踪调试工具
strip删除多余的段
objcopy将一个目标文件中的内容拷贝到另一个中

 

 

 

 

 

参考

关于Linux静态库和动态库的分析

程序的编译链接过程

程序运行流程——链接、装载及执行

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值