GNU Compile Tools, 可执行文件, 静态链接库, 动态链接库

原创 2006年06月01日 16:52:00

Compile Process


对于一个编译型语言,编译器工作时总要经过预处理、编译、链接等几个过程。以 C/C++ 为例:预处理器(cpp)将每个 .c/.cpp 文件中 #include 的头文件都合并到 .c/.cpp 文件中,并且对其进行宏扩展,由此生成数个编译单元。一般来说每个 .c/.cpp 文件对应一个编译单元。随后,编译器(cc)将每个编译单元翻译成本地二进制代码,在 GNU/Linux 中后缀是 .o,在 ms vc 中后缀 .obj。这种二进制代码又被称为 object 文件,和最终的目标文件一样也有 code, data, heap, statck 等数据段,但却不可以被运行(缺少入口点)。链接器(ld)将多个 object 文件在目标文件中重新定位,也就是 relocate 的过程,再加入额外的一些代码(其他的链接文件),最终生成目标文件。目标文件可以是可执行文件,静态链接文件,或者动态链接文件。


Make static or shared library

在 GNU/Linux 系统中静态链接文件实际上就是多个 .o 文件的压缩包。假设我们有 cool.h cool.c 和 some.c 文件,要得到静态链接库 libcool.a。首先使用如下指令得到相应的 object 文件 cool.o 和 some.o:

    gcc -c cool.c

    gcc -c some.c

用这种方法生成的 object 文件称为 PDC 即位置相关代码(position-dependence code)。再使用如下指令可以得到静态链接文件 libcool.a:

    ar -r libcool.a cool.o some.o
    ranlib libcool.a

静态链接库 libcool.a 遵从 GNU/Linux 规定的静态链接库命名规范,必须是"libyour_library_name.a"

在 GNU/Linux 中动态链接文件,必需通过链接器 ld 生成。假设我们有 hot.c other.c 等文件要生成动态链接库 libhot.so 。首先使用如下指令得到相应的 object 文件 hot.o 和 some.o

    gcc -fPIC -c hot.c
    gcc -fPIC -c other.c

参数 -fPIC 指定生成的 object 文件为位置无关代码(position-independence code),只有 PIC 可以被用作生成动态链接库。然后使用如下指令得到动态库:
   
    ld -Bshared -o libhot.so hot.o other.o

或者可以使用编译器的ld wrapper:
   
   
gcc -shared -o libhot.so hot.o other.o

也可以使用编译器直接生成动态库:

   
gcc -fPIC -shared -o libhot.so hot.c other.c

这里选项 -shared 指示目标文件的类型是动态链接库,动态库的命名规范是"libyour_library_name.so"


Link static or shared library

上面提到,在链接过程中需要从其他的链接文件中引入一些额外的代码,比如:在我们的程序里用到了 jpeg 的解码函数我们就需要从 libjpeg 中导入我们需要的函数

待续...
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux 查看可执行文件动态链接库的相关信息

ldd        查看可执行文件链接了哪些  系统动态链接库 nm        查看可执行文件里面有哪些符号 strip ...

linux 查看可执行文件动态链接库相关信息

ldd        查看可执行文件链接了哪些  系统动态链接库 nm        查看可执行文件里面有哪些符号 strip ...

linux 查看可执行文件动态链接库相关信息

ldd        查看可执行文件链接了哪些  系统动态链接库 nm        查看可执行文件里面有哪些符号 strip ...

Linux ldd -- 查看可执行文件所依赖的动态链接库

我们知道“ldd”这个命令主要是被程序员或是管理员用来查看可执行文件所依赖的动态链接库的。是的,这就是这个命令的用处。可是,这个命令比你想像的要危险得多,也许很多黑客通过ldd的安全问题来攻击你的服务...

Makefile常用万能模板(包括静态链接库、动态链接库、可执行文件)

转载http://www.cnblogs.com/prettyshuang/p/5552328.html 本文把makefile 分成了三份:生成可执行文件的makefile,生成静态链...

通过HookNtCreateSection 动态监控驱动sys、动态链接库dll、可执行文件exe加载

[cpp] view plaincopyprint? /*  windows2003 x86/x64 window7 x86 windows2008 R2 x64测试通...

GNU Autotools (autoconf, automake, libtool, etc.) 自动化编译 (2) 多目录和动态链接库

0. 基础     先阅读GNU Autotools (autoconf, automake, libtool, etc.) 自动化编译 (1) 简单示例并成功执行、理解所说内容。 1. 先提供一...
  • cppgp
  • cppgp
  • 2012-02-15 23:55
  • 1817
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)