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
猜你喜欢
- 根据笔者目前了解到的最新消息:信产部的二期网站备案系统即将于明日9月20日上线,全新的备案系统将确保备案提交当天即可通过备案。备案站点的审核
- Microsoft Exchange Server 2007已经发布一段时间了,和以前的exchange版本相比在高可用性方面有了很大的改进
- 病毒式营销目的是为了被营销对象在公众环境中有效进行传播,以帮助你的生意或者你所提供的服务更好地开展下去。病毒式营销分为两种:一种是针对传统领
- 进入mysql命令:mysql -u+(用户名) -p+(密码 )mysql语句命令后面一定要加“;”查询库名:show databases
- 百度site:首页出现"访问本页面,您的浏览器需要支持JavaScript".这样的情况,对于一个刚刚引起搜索引擎重视的
- 1、网页使用框架框架内的内容通常不在搜索引擎抓取的范围之内。2、图片太多,文本太少3、提交页面转向另一网站搜索引擎可能完全跳过这个页面。4、
- 有GoDaddy用户问“从我的旧服务器的域名服务器重新定位前,能在我的新托管帐户上运行脚本吗?”答案是否定的,此时还没有到服务器的真实路径,
- 更改个人账户密码普通用户想要更改自己的个人帐户密码,只需要运行passwd命令,不用带任何其他的命令:$ passwd示例输出:Changi
- 雅虎首席执行官卡罗尔·巴茨(腾讯科技配图)北京时间11月19日消息,据国外媒体报道,《华尔街日报》专栏作家卡拉·斯韦什尔(Kara Swis
- 我是一名老站长,但是我不是年龄老,而是我接触这一行已经快7个年头。本身也是可以和HAO123,9FLASH平起平坐的。可是由于自己的不坚定,
- 最近总结了一些VirtualBox虚拟机使用技巧,以备不时之需,具体如下:1. 如何将别人做好的镜像拿到自己的虚拟机上使用.将已安装好的虚拟
- 以前我们学校的服务器经常中毒,而且基本上是一个网站中毒而牵连到其他的网站。这无非是服务器的权限配置没做好,让黑客们利用一个大权限用户把整台服
- 大量复制内容网站有的时候会影响关键字的排名。比如说原本是你写的文章,本来应该排名很好,但是其他人抄袭或转载你的文章,而且搜索引擎不幸的判断那
- 1.安装JDK1.1 检查当前虚拟机环境有没有JDK rpm -qa|grep java1.2 卸载 r
- 要使你的IIS服务器支持伪静态重写,按以下步骤来:1. 安装重写插件Rewrite.dll 如果你的 IIS 服务器加载过 Rewrite.
- 首先,在这里感谢军哥和LEB博主,这个一键包主要借鉴的就是这两位高手的脚本。其中前端后端配置是军哥的,脚本的主要结构是LEB的。请向上面两位
- 近日,中国首个国家网络电视台开始大规模建设,不仅集纳央视及各省市台节目,还吸引社会视频制作机构加盟,甚至支持网民原创作品上线发布。在发展模式
- 提高IIS网站服务器执行效率的第八种方法:静态网页采用HTTP 压缩静态网页采用HTTP 压缩,大约可以减少20%的传输量。HTTP压缩功能
- 现象:机器正在调试或允许IIS时,被异常中断服务(比如停电),然后再次IIS运行页面时,CPU资源占用100%,即使重新启动也无效。 原因:
- 去年9月以来各浏览器市场份额变化情况(腾讯科技配图)腾讯科技讯(中涛)北京时间8月2日消息,据国外媒体报道,美国互联网流量监测机构Net A