Linux动态链接库的使用
作者:fariver 发布时间:2023-09-21 19:56:55
动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。
针对二进制文件有用的命令
查看文件类型
file
查看二进制文件链接到哪些库
ldd
查看二进制文件里面所包含的symbol,T表示加载,U表示undefined symbol
nm
读二进制文件里面的信息
readelf -a smu.o
将二进制文件转换为汇编
objdump -d sum.o
动态链接库的生成
sum.c
#include <stdio.h>
#include <stdlib.h>
int sum(int x){
int i, result=0;
for(i=0; i<=x; i++){
result+=i;
}
if(x > 100)
exit(-1);
return result;
};
void display(char* msg){
printf("%s\n",msg);
}
int add(float a,float b){
return a+b;
}
int sum_array(int array[], int num){
int i =0, sum = 0;
for(i=0; i<num; ++i)
sum += array[i];
return sum;
}
void modify_array(int array[], int num){
int i =0, sum = 0;
for(i=0; i<num; ++i)
array[i] *= 10;
}
main.c
#include <stdio.h>
#include <stdlib.h>
int main(void){
int x;
printf("Input an integer:\n");
scanf("%d", &x);
printf("sum=%d\n", sum(x));
return 0;
};
生成可执行文件
gcc -c main.c -o main.o
gcc -c sum.c -o sum.o
gcc sum.o main.o
将会生成main的可执行文件
file main // ELF 64-bit LSB executable
file sum.o // ELF 64-bit LSB relocatable
因为sum.c里面含有可复用的函数,所以想把sum.c编译成为一个动态链接库
gcc sum.o -shared -o sum.so
出现错误,提示
/usr/bin/ld: sum.o: relocation R_X86_64_PC32 against undefined symbol `exit@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
这说明不是所有的.o文件都能编译成为动态链接库,需要在.o文件生成时加参数-fPIC
gcc -c sum.c -fPIC -o sum.o
gcc sum.o -o shared sum.so
一般,共享库的编译命令为(曾经的实验)
动态链接库
gcc -shared -fPIC -o libmyhello.so hello.o
gcc -o hello main.c -L. -lmyhello
静态链接厍
ar rcs libxx.a xx.o
g++ -o main main.cpp -static -L. -lxx
这时候再
g++ -o main main.c sum.so
./main
有时会报错
error while loading shared libraries: sum.so: cannot open shared object file: No such file or directory
ldd main
output:
sum.so => not found
这时候需要
export $LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH
注意:-fPIC是生成.o时使用,-shared是用来生成动态链接库的
来源:https://www.cnblogs.com/fariver/p/6560885.html


猜你喜欢
- 我现在做的站已经成了我们本地最大的一个地方站,内容涉及很多方面,当初最站的时候,并没有想到要做一个大而全的地方门户网站,只是想做一个摄影交流
- Docker 是 dotCloud 最近几个月刚宣布的开源引擎,旨在提供一种应用程序的自动化部署解决方案,简单的说就是,在 Linux 系统
- 事先声明,本人是新手站长,假如其中有不当的地方请指正,不咬骂偶。 本人做站几年了,不过是在单位里面做,写一些小系统,所以很少接触什
- 2008年4月初开始了健康之家的建设,就从代理商那里买了空间域名,开始建站。一开始用了风讯CMS新闻发布系统,架构好网站以后,因为自己是学生
- apache|服务器|高级作为系统管理员,若你只有一个IP地址,却有好几个域名,又要求访问每个域名都要看到不同的内容,那怎么办?总不至于为每
- 想查看最近有哪些好莱坞大片要上映吗?想要查看电影的主角及导演吗?想要浏览电影的剧情简介吗?想要观看高清的预告片来决定是否提前买首映票吗?那么
- 先给大家献上VMware 14 激活码FF31K-AHZD1-H8ETZ-8WWEZ-WUUVACV7T2-6WY5Q-48EWP-ZXY7
- 泛搜索时代,我在考虑了很久后才决定用“泛搜索”这样一个词来表达我的想法,这个泛有广泛的意思。泛搜索即搜索已经无处不在,并不仅仅局限于传统的通
- 分词技术对搜索引擎来说是指将文本中的词语分离和抽取出来,使得搜索引擎能够通过矩阵,向量等方式保存网页并作出合适的索引,对于我们seo来说是将
- 最近集中精力学习了一下前辈们的网站营运及推广经验,和如何实现盈利的方法,针对目前我所运营的深圳掘吧网不温不火的现状,决定作出一次尝试:去扫街
- 如何才能让搜索引擎快速搜录你的网站,我总结了一下,大概有一下几点:1、提交给搜索引擎,这个相对简单,不详细说明;2、交换友情链接,比如说CH
- 本报记者 雷中辉 北京报道“我们还没有接到实施细则的通知,具体怎么办还不清楚。”7月22日,北京市工商行政管理局大厅,当记者询问电子商务网店
- 微软在MSDN IE blog上列举了开发者感兴趣的IE8 beta1的七大改进,其中包括CSS2.1的完整支持,HTML5的支持,内置开发
- 下周22日微软便会正式发布Windows7操作系统。不过有趣的是,据Broadpoint AmTech公司的研究员Brian Marshal
- 做网站,想必每一位站长的心愿都是一致的——更多的流量以便带来更多的收益!因此,不断宣传和推广自己的网站,让更多的人知道、了解并信赖你的网站,
- 1) 添加或扩大交换分区#dd if=/dev/zero of=/home/swap bs=512 count=1024000bs 是扇区大
- 雅虎首席执行官卡罗尔·巴茨(腾讯科技配图)北京时间11月19日消息,据国外媒体报道,《华尔街日报》专栏作家卡拉·斯韦什尔(Kara Swis
- 随着信息化办公的普及,远程访问的需求也水涨船高。一些远程访问工具,也纷纷面世。如电子邮件、FTP、远程桌面等工具为流离在外的企业员工,提供了
- SEO之所以难学,经笔者分析最大的原因是大家把SEO太复杂化了,禅说:“简单就好”。现在各类有关SE
- 许多人在用IIS建设网站的过程中或多或少都会出现问题,在IIS6中有些是以前版本中就曾经出现过,IIS6中也有些是新发现的问题,本文在此对建