首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

(3)动态库的情况下,有两个文件,一个是引入库(.LIB)文件(实际也算是一个静态库,只是链接只能把函数DLL的入口链接到exe中,而不像真正静态链接库那样将函数体真正链接到exe中 ,通过lib...进行的动态链接实际使用了静态链接来实现 ),一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中...(这里实际是可以写上任意obj文件或者lib文件的). linux .o,.a,.so .o是中间文件,相当于windows系统下的.obj文件 。....a为静态库,是好多个.o合在一起,用于静态链接, 相当于windows系统下的lib。 .so 为共享库,是shared object,用于动态链接的,相当于windows系统下的dll。...Linux下,共享库的加载是由/lib/ld.so完成的,ld.so加载共享库,会从ld.so.cache查找。 创建函数库示例 我们通常把一些公用函数制作成函数库,供其它程序使用

4K52

Linux编译相关命令

一、编译可执行文件 g++ –c Hello.cpp  编译文件,生成目标文件Hello.o g++ Hello.oo a.out  链接并重命名为可执行文件...编译相关选项 (1)-c 生成.o文件,对代码文件进行预处理、编译和汇编,相当于windows下生成目标文件obj g++ -c hello.cpp...libmyhello.so (5)使用动态库 动态库的时候和静态库使用一样,唯一值得注意的是当目录中同时存在相同名称的动态库和静态库,编译的时候优先使用动态库...这一个库不同进程中的虚拟地址不同,但操作系统显然会把它们映射到同一块物理内存。...不加fPIC,则加载so文件,需要对代码段引用的数据对象需要重定位,重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样

3.3K00
您找到你想要的搜索结果了吗?
是的
没有找到

Linux gcc链接动态库出错:LIBRARY_PATH和LD_LIBRARY_PATH的区别

昨天自己的CentOs7.1写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错。...链接命令大概是这样的: [root@typecodes tcpmsg]# gcc -o hello main.c -lmyhello /usr/bin/ld: cannot find -lmyhello...2 Google查找 /usr/bin/ld: cannot find -l* 的出错原因 gg了很久gcc ld链接动态库出错的原因,结果还是没找到理想的答案。...4.1 Linux gcc编译链接的动态库搜索路径 GCC编译、链接生成可执行文件,动态库的搜索路径就包含LIBRARY_PATH,具体的搜索路径顺序如下(注意不会递归性地在其子目录下搜索): 1、...4.2 执行二进制文件的动态库搜索路径 链接生成二进制可执行文件后,运行该程序加载动态库文件就会搜索包含LD_LIBRARY_PATH路径下的动态库,具体顺序如下: 1、编译目标代码指定的动态库搜索路径

37810

静态链接库和动态链接库的区别

shared :生成共享库3.2、隐式方式使用动态库程序中隐式使用动态库和使用静态库完全一样,也是使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件指明动态库名进行编译...动态库的搜索路径搜索的先后顺序是:1.编译目标代码指定的动态库搜索路径;2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;3.配置文件/etc/ld.so.conf中指定的动态库搜索路径...函数dlerror:原型为: const char *dlerror(void);当动态链接库操作函数执行失败,dlerror可以返回出错信息,返回值为NULL表示操作函数执行成功。...filename: 如果名字不以/开头,则非绝对路径名,将按下列先后顺序查找该文件:(1) 用户环境变量中的LD_LIBRARY值;(2) 动态链接缓冲文件/etc/ld.so.cache(3) 目录/...使用时应包含的头文件Winbase.h(include Windows.h)dlfcn.h5、特殊情况我们回过头看看,发现使用静态库和隐式方式使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名

7.9K21

GCC 编译器的使用

Windows 下进行开发,只需要点几个按钮即可编译,集成开发环境(比如 Visual studio)已经将各种编译工具的使用封装好了。...\n"); 04 } 05 ARM 版本的编译工具与 gcc、ld 等工具的使用方法相似,很多选项是一样的。本节使用 gcc、ld 等工具进行编译、链接,这样可以 PC 直接看到运行结果。...在编译 bootloader、内核,用到这个选项──它们用到的很多函数是自包含的。 (5)-static 支持动态链接(dynamic linking)的系统,阻止链接共享库。...: $ gcc -c -o main.o main.c 链接程序,下面的指令将出错,提示找不到库文件: $ gcc -o test main.o -lsub /usr/bin/ld: cannot find...2.9 ld/objdump/objcopy 选项 我们开发 APP ,一般不需要直接调用这 3 个命令;开发裸机、bootloader ,或是调试 APP 时会涉及,到时再讲。 -end-

3.8K31

GoAhead环境变量注入复现踩坑记

这个老漏洞的原理也很简单,就是GoAhead处理CGI请求,将用户传入的的参数作为环境变量了。这样,通过LD_PRELOAD就可以劫持CGI进程的动态链接库,进而执行任意代码。...但由于这个限制使用错了函数,导致实际并没有生效(这就是不写单元测试的后果,但换句话说,又有多少漏洞POC是从单元测试里泄露的?) 补丁还将用户传入的参数名前面增加了前缀,导致无法劫持任意环境变量。...我们的目的是服务器上传一个可控内容的文件,然后将环境变量LD_PRELOAD设置为这个文件的路径,这样来劫持动态链接库。很容易想到另一个方法就是通过上传文件的形式来创建文件。...这就是第三个坑:攻击使用的动态链接库不能过大,否则可能导致服务端出错,直接断开链接。 我们可以gcc的时候增加-s参数来缩小payload体积: gcc -s -shared -fPIC ....有两种方法: 使用两个线程,线程一流式缓慢上传文件,线程二使用LD_PRELOAD包含这个文件 给payload.so文件内容后增加一些脏字符,并将HTTP的Content-Length设置成小于最终的数据包

41820

快速上手和使用makefile

其实就是文件前后的依赖关系。 windows下的IDE编程,很少听说这个东西,实际是IDE环境自动给你做了这个工作而已,不需要你手动去编写了。...一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile...一般来说,每个源文件都应该对应于一个中间目标文件O文件或是OBJ文件)。 链接,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件O文件或是OBJ文件)来链接我们的应用程序。...链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接需要明显地指出中间目标文件名,这对于编译很不方便,所以...,我们要给中间目标文件打个包,Windows下这种包叫“库文件”(Library File),也就是 .lib 文件UNIX下,是Archive File,也就是 .a 文件

1.3K20

吴章金: 如何创建一个*可执行*的共享库

先来看看两类文件的区别 当前 Linux 下面的二进制程序标准格式是 ELF,这类格式可以用来表示 4 种不同类型的文件: 可重定位目标文件(.o),用于静态链接 可执行文件格式,用于运行时创建进程映像...可执行文件有标准的 C 语言程序执行入口 main,而共享库则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址链接是相对的,在装载动态分配和计算符号地址 接下来做个实验具体看看两者的区别...如果没有 -rdynamic,链接就没法使用。.../libhello.so hello 也可以当共享库使用: $ gcc -m32 -o hello.noc -L./ -lhello $ LD_LIBRARY_PATH=$LD_LIBRARY_PATH...\n"); } 当普通共享库使用,默认编译即可,要能够执行的话,实现一下 entry(),编译打开 EXEC_SHARED 即可: $ gcc -m32 -shared -fpic -o libhello.so

1.1K20

gcc用法以及静态动态链接

目标文件需要创建成位置无关码,概念就是可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。 -l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名。...放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错出错信息大概是:...#include有两种方式 使用包含的头文件一般会先搜索-I选项后的路径(即用gcc编译的-I选项),之后就是标准的系统头文件路径。...-lhello -L. .PHONY : clean clean : -rm hello_static.o libhello.a libhello.so main_s main_d 链接hello...问题 静态链接使用-static出现错误: /usr/bin/ld: cannot find -lm collect2: ld 返回 1 make: *** [main_s] 错误 1 安装glibc-devel

1.5K20

Linux库详解

windows平台和linux平台下都大量存在着很多库。因此库文件是为了方便升级、维护或二次开发,而发布的一组可以单独与应用程序在编译时或运行时链接的二进制可重定位目标码文件。...Linux下编译源码文件经过编译生成.o的目标文件,.o的目标文件链接阶段经过链接生成可执行程序。...所以链接阶段可以链接.o的目标文件,也可以把所有.o的目标文件进行打包,统一进行链接,因此打包.o文件生成的文件,就是静态库。...静态库只程序链接阶段被链接使用链接器会将程序中使用到代码段和数据段从库文件中拷贝进来。当链接完成并生成可执行程序后,程序执行阶段就不需要静态库了。...共享库 动态库程序编译并不会被链接到目标代码中,而是程序运行时才被载入,因为可执行文件体积较小。

2K40

Linux共享库、静态库、动态库详解

; 2、动态函数库同共享函数库是一个东西(linux叫共享对象库, 文件后缀是.so ,windows叫动态加载函数库, 文件后缀是.dll) Linux中命名系统中共享库的规则 2....我建议将链接器名称作为与soname的符号链接,因为大多数情况下,如果您更新库,那么您希望链接自动使用它。我问HJ Lu为什么ldconfig不会自动设置链接器名称。...此预加载文件通常用于紧急补丁; 分发通常不会在交付包含这样的文件程序启动搜索所有这些目录将是非常低效的,因此实际使用了缓存安排。...程序ldconfig(8)默认读入/etc/ld.so.conf文件动态链接目录中设置适当的符号链接(因此它们将遵循标准约定),然后将缓存写入/ etc / ld.so.cache,然后被其他程序使用...启动,动态加载器实际使用文件/etc/ld.so.cache,然后加载它需要的库。 顺便说一句,FreeBSD对这个缓存使用稍微不同的文件名。

8.7K10

c++动态库和静态库的区别_静态库里面包含动态库

所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤: 图:编译过程 静态库 之所以成为【静态库】,是因为链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。...Windows下创建与使用动态库 创建动态库(.dll) 与Linux相比,Windows系统下创建动态库要稍微麻烦一些。...l const char *dlerror(void):当动态链接库操作函数执行失败,dlerror可以返回出错信息,返回值为NULL表示操作函数执行成功。...目标文件需要创建成位置无关码, 念就是可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。 l -L. :表示要连接的库所在的目录。 l -l:指定链接需要的动态库。...l -c :只激活预处理、编译和汇编,也就是把程序做成目标文件(.o文件) 。 l -Wl,options :把参数(options)传递给链接ld

1.7K30

详解动态库和静态库

前言 C、C++中我们使用过标准库,比如在使用strerror、vector、string等,都只是调用了这些函数接口,这些都是需要具体的实现。...让我们来看看C语言库: 将来运行程序,需要二进制文件和库文件 看下C++标准库: Linux系统中,.so结尾是动态库,以.a结尾是静态库; Windows中,.dll结尾是动态库,lib结尾是静态库....c文件可形成一个.o文件,将这些.o文件链接形成可执行文件,头文件是一个手册,提供函数声明,告诉用户如何使用,.o文件提供实现,我们只需要补充一个main文件,调用头文件提供的方法,然后和.o文件进行连接...,ar是gnu归档工具,rc表示replace and create 静态库的形成本质是将所有的.o文件打包,因此需要先生成.o文件 发布静态库 发布静态库就是自己的lib拷贝给比人 例如上图是我自己制作的一个简单静态库...,来使用静态库: 虽然生成了可执行文件,但是可执行文件出错使用ldd a.out,发现libmyc.so => not found,动态库没有被找到,编译期间已经告诉系统对应的头文件以及库的位置

9810

动态库与静态库优缺点比较分析_c静态库和动态库的区别

使用方法分库大体可以分为两类:静态库和共享库。windows中静态库是以 .lib 为后缀的文件,共享库是以 .dll 为后缀的文件。...静态库的链接方法: gcc –o staticcode –L....–lstatic main.c –static(默认库在当前文件夹) 共享库的链接方法: gcc –o sharedcode -L....–lshared main.c(默认库在当前文件夹) 当程序与静态库连接,库中目标文件所含的所有将被程序使用的函数的机器码被copy到最终的可执行文件中。...动态库程序编译并不会被连接到目标代码中,而是程序运行是才被载入,因此程序运行时还需要动态库存在 1.什么是库 windows平台和linux平台下都大量存在着库。

3.1K20

gcc的编译命令_cmake 编译

虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下;Windows使用的库文件主要放在Visual Stido的目录下的include...例如我们的程序test.c是linux使用c连接mysql,这个时候我们需要去mysql官网下载MySQL Connectors的C库,下载下来解压之后,有一个include文件夹,里面包含mysql...3.3强制链接使用静态链接库 默认情况下, GCC链接优先使用动态链接库,只有当动态链接库不存在才考虑使用静态链接库,如果需要的话可以在编译加上-static选项,强制使用静态链接库。.../usr/dev/mysql/lib目录下有链接所需要的库文件libmysqlclient.so和libmysqlclient.a,为了让GCC链接只用到静态链接库,可以使用下面的命令: gcc...–L /usr/dev/mysql/lib –static –lmysqlclient test.oo test 静态库链接搜索路径顺序: 1. ld会去找GCC命令中的参数-L 2.

1.8K30

静态库和动态库制作

所谓的静态、动态指的是链接的过程。 ---- 一、静态库和动态库介绍 1、静态库 程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库。...静态库文件中静态展开,所以有多少文件就展开多少次,非常吃内存,100M 展开 100 次,就是 10G,但是这样的好处就是静态加载的速度快。...2、动态库 程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。...三、动态库的制作及使用 动态库的名字是以 lib 开头,以 .so 结尾,例:libmylib.so 1、生成位置无关的 .o 文件 gcc -c sub.c -o sub.o -fPIC 使用.../test 出错原因分析: 连接器: 工作于链接阶段,工作需要 -l 和 -L 动态链接器: 工作于程序运行阶段,工作需要提供动态库所在目录位置 解决办法:指定动态库路径并使其生效,然后再执行文件

18320

linux编译so库「建议收藏」

:libtest.so gcc test_a.c test_b.c -fPIC -shared -o libtest.so 分析:-fPIC是位置无关码,-shared是按照共享库的方式来链接 二、动态库...-ltest -o main 分析: -L参数:指明要链接的so库所在路径(如-L. 表示当前路径, -L...../so 表示当前路径的一层目录的so子文件夹中) -l参数:指明要连接的库的名字,如-ltest 表示要链接libtest.so库 三、运行main 现象:运行出错,报错信息: error while...(cp libtest.so /usr/lib即可) 解决方法二: 使用环境变量LD_LIBRARY_PATH。将libtest.so所在目录导出到LD_LIBRARY_PATH即可。...如:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/winshare/so_test 补充:ldd命令 作用:查看一个可执行程序使用了哪些共享库,

3.2K40
领券