程序的加载和链接

 

 

 

hello.h

 #ifndef HELLO_H
 #define HELLO_H

 void hello(const char *name);

 #endif //HELLO_H

 

hello.c

#include 
 
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静态库和动态库的分析

程序的编译链接过程

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

 

 

你可能感兴趣的:(linux,C和C++)