所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。.so文件是共享库文件(动态链接)。动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息),仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序...
/usr/bin/ld: /usr/local/ssl/lib/libcrypto.a(x86_64cpuid.o): relocation R_X86_64_PC32 against `OPENSSL_cpuid_setup‘ can not be used when making a shared object; recompile with -fPIC
##g++编译动态库时,使用了ssl的静态库/usr/local/ssl/lib/libcrypto.a,结果一直报上面的错误用openssl0.9.8的的源码重新编译该库,还是报同样的错误,网上搜索了一番,发现正确的编译ssl的流程是./config -fPICmake make install由...
head.h#include<iostream>
void fun1();
void fun2();
void fun3();fun1.cpp#include "head.h"void fun1()
{std::cout<<"fun1"<<std::endl;
} fun2.cpp#include "head.h"void fun2()
{std::cout<<"fun2"<<std::endl;
} fun3.cpp#include "head.h"void fun3()
{std::cout<<"fun3"<<std::endl;
} main.cpp#include "head.h"int main()
{fun1();fun2();fun3();
} 将fun1.cpp,fun2.cpp,fun3.cpp生成目标文件g++ –c fun1.c fun2.c fun...
dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现。它需要两个参数:一个文件名和一个标志。文件名就是一个动态库so文件,标志指明是否立刻计算库的依赖性。如果设置为 RTLD_NOW 的话,则立刻...
在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结:fPIC的全称是 Position Independent Code, 用于生成位置无关代码。什么是位置无关代码,个人理解是代码无绝对跳转,跳转都为相对跳转。1、不加fPIC选项即使不加fPIC也可以生成.so文件,但是对于源文件有要求,例如因为不加fPIC编译的so必须要在加载到用户程序的地址空间时重定向所有表目,所以在它里面不能引用其它地方的代码如...
静态库
先说说我们为什么需要库?当有些代码我们大量会在程序中使用比如(scanf,printf等)这些函数我们需要在程序中频繁使用,于是我们就把这些代码编译为库文件,在需要使用时我们直接链接即可。定义:?程序在编译时把静态库的代码链接到可执行程序中,在代码运行时不再需要静态库。(简单理解就是把一堆 .o 文件打包到一起,当需要用到就让我们的程序链接进来)生成及使用方法:??这里用加减乘除来举例示意://创建所需文件
[r...
/*********************************************************************
* Author : Samson
* Date : 04/03/2014
* Test platform:
* Linux ubuntu 3.2.0-58-generic-pae
* GNU bash, version 4.2.39
* *******************************************************************/动态链接时、执行时搜索路径顺序:
1.编译目标代码时使用-L指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定...
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一、基本概念1.1什么是库在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的平台不同(主要是编译器、汇编器和连接器的不同),因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。 1.2库的种类linux下的库有两种:静态库和共享库(动态库)。二者的不同点在于代...
转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog) zlib库是一个强大的通用的开源压缩库,用途比较广,在windows下能够很容易的编译或者拿到编译成功的二进制文件。但是linux下的比较少,本文记录一下如何编译。zlib官方网站:http://www.zlib.net首先,下载源码来安装zlib软件包。目前最新的版本是1.2.8。#wget http://www.zlib.net/zlib-1.2.8.tar.gz 然后,解压下载的文件包。#tar -xvf zlib-1.2.8.tar.gz#cd zib...
程序运行是加载动态库的几种方法:第一种,通过ldconfig命令 ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令它,ldconfig命令通常在系统启动时运行,而当一个用户安装我新的动态库时,就需要手工运行这个命令。ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建...
情况是这样的 做了两个动态库,一个是操作sqlite的,一个是操作postgresql的。这两个动态库接口是一样的。 再做一个PHP扩展模块,调用sqlite的动态库或者postgresql的动态库。 Windows下都正常,在链接的时候会找对应的lib,调用sqlite或者postgresql都行。 但Linux下,编译PHP扩展模块的时候,只找头文件,不找动态库。编译是通过了,但运行的时候就出错。怎么解决下。 回复讨论(解决方案) 先ldd看一下你的扩展是否有...
自己编写了个PHP扩展模块,在扩展模块中需要调用另外一个动态库,也是自己写的。Linux下怎么情况是这样的做了两个动态库,一个是操作sqlite的,一个是操作postgresql的。这两个动态库接口是一样的。再做一个PHP扩展模块,调用sqlite的动态库或者postgresql的动态库。Windows下都正常,在链接的时候会找对应的lib,调用sqlite或者postgresql都行。但Linux下,编译PHP扩展模块的时候,只找头文件,不找动态库。编译是通过了,但运行的...
参考资料:
1.博客1:https://www.cnblogs.com/zuofaqi/p/10440754.html
2.博客2:https://blog.csdn.net/wangsiman/article/details/80031397
3.博客3:https://blog.csdn.net/chenzixun0/article/details/56278632
最近在做OTA相关工作,需要将不同架构(arm和x86)下的程序统一放到一个架构(arm)下进行统一管理。
涉及到的问题,不同程序有不同链接的动态库(xx.so),如何对一个ELF文件(linux下的可执行文件)进行正确的动...
一、库的介绍
在windows和Linux下都存在着大量的库,库是什么呢?本质上来说,库是一种可执行代码的二进制文件,可以被操作系统载入内存执行。我们通常将一些通用函数写成函数库,所以库是别人写好的,现有的、成熟的,可以复用的代码。我们显示写代码不可能每一份代码都从头编写,但当我们拥有库时,我们就直接可以将我们所需要的文件链接进我们的程序中,可以节省大量的时间,提高效率。Linux下主要有两种库:静态库和动态库。
二...
生成可执行程序的链接方式:
动态链接:动态链接:链接动态库,只是在生成的程序中记录库中的函数信息表,并没有将具体代码的实现写入到程序中。因此运行动态链接生成的程序时,需要与依赖动态库的存在。 优点:内存中共享一份代码,没有代码冗余静态链接:静态链接:链接静态库,在生成的程序中直接将库中所需函数的实现写入到可执行程序中,生成的程序比较大,但是没有依赖性。库的生成1、将原码经过编译汇编之后,解释成为一个二...