首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

自定义规则实现将多个静态库合并为一个动态库或静态库

比如我们手动的将多个静态库(libA.a、libB.a、libC.a)合并为一个动态库(libcombined.so): $ gcc -shared -fPIC -Wl,--whole-archive...libA.a libB.a libC.a -Wl,--no-whole-archive -Wl,-soname -o libcombined.so “注:-Wl,option 后面接的选项最终会作为链接器...在编写规则中我们就需要获取当前的编译器,我们不能直接使用固定的路径,比如 Linux 下 /usr/bin/gcc,因为可能是交叉编译器,路径就不一样了。...方式二(需安装libtool): # MacOS系统 $ libtool -static -o libcombined.a libA.a libB.a libC.a 在 Unix-like 系统上:...$ sudo apt-get install libtool-bin # 生成的libcombined.a ar -x 解压出来是 libA.a libB.a libC.a ,而不是 *.o 文件。

4.9K20

从程序员角度看ELF

.2 crt1.o crti.o crtbegin.o test.o -L /usr/lib/gcc/i386-redhat-linux/4.0.0/ -ldl -lc crtend.o crtn.o...crtend.o的.init代码含有对__do_global_ctors_aux()的调用,这说明C++构造函数是在前面所有.o文件(如 crti.o、crtbegin.o、test.o以及其他libc.a...其实也可 以理解,因为构造函数位于较高层次,很可能依赖于很多其他元素,如libc.a中的函数,因此先调用这些元素的.init代码也合情合理,就像C++构造子类时要先构造其父类一样。   ...crtbegin.o的.fini代码含有对__do_global_dtors_aux()的调用,这说明C++析构函数是在后面所有.o文件(如 test.o、libc.a中的*.o、crtend.o、crtn.o...通过dynamic段,链接器在它自己的数据段中找到自己的重定位项表和   重定位指针,然后解析例程需要加载的其它东西的代码引用(Linux ld.so将所有的基础例   程都命名为由字串_dt

93240

程序一定要从main函数开始运行吗?

Linux一般程序的入口是__start函数,程序有两个相关的段: init段:进程的初始化代码,一个程序开始运行时,在main函数调用之前,会先运行.init段中的代码。..."); SEARCH_DIR("=/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr.../lib/x86_64-linux-gnu64"); SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/...o (OS specific), p (processor specific) 工具小贴士 关于静态链接库: ar rcs libxxx.a xx1.o xx2.o 打包静态链接库 ar -t libc.a...查看静态链接库里都有什么目标文件 ar -x libc.a 会解压所有的目标文件到当前目录 gcc --verbose 可以查看整个编译链接步骤 关于objdump: objdump -i 查看本机目标架构

1.2K30
领券