`
luozhaoyu
  • 浏览: 347076 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编写GNUGCC下的动态链接库程序

    博客分类:
  • C
阅读更多
先来一个简单的编译时动态链接的例子
创建文件function.h
#include <stdlib.h>                                                             
#define int_t int
int_t foo(int_t i, int_t j);


创建文件function.c
#include "function.h"                                                           

int_t foo(int_t i, int_t j)
{
    if (i > j)
        return i;
    else
        return j;
}


创建文件main.c
#include "function.h"                                                           

int_t foo(int_t i, int_t j)
{
    if (i > j)
        return i;
    else
        return j;
}


先编译生成动态链接库文件
gcc -shared -fPIC function.c -o function.so

-shared表示生成共享的目标文件,这种目标文件可以与其它相同标识(同为-fPIC或同为-fpic)的目标文件链接成可执行文件
-fPIC表示生成position-independent code(平台无关的代码)用于共享库。这种code在访问所有常量地址时,会通过系统的global offset table(GOT)。当程序开始运行时,动态加载器会去解析那个GOT。注,-fPIC比-fpic生成的代码要大,所以不用担心GOT大小超过限制的问题

最后将主程序与动态链接库链接
gcc -o main -L ./ main.c function.so

-L表示链接库的地址

注意运行时要把function.so放到/usr/lib之下




运行时动态链接的例子

编辑文件dltest.c
#include <stdlib.h>
#include <dlfcn.h>--------------------------------------------------------------void main()-
{-
    int (*func)(int i, int j);-
    void *dlhandle;-
    char *dlError;-
    printf("hello! I'm main.c\n");
    dlhandle = dlopen("./function.so", RTLD_LAZY);-
    if (dlhandle == NULL)
    {
        printf("dlhandle error\n");
    }
    dlError = dlerror();-
    func = dlsym(dlhandle, "foo");-
    printf("%i\n", func(10, 30));
    dlclose(dlhandle);
}


同上文一样,生成function.so文件,只不过这个文件应该不用扔到/usr/lib中
链接文件
gcc -o dltest -ldl dltest.c

提一句选项-ldl的意思并不是说有一个gcc选项叫-ldl,而是-l dl的意思,把dl库链接过来,而这个dl库应该是包含了dlfcn.h等等文件吧。
分享到:
评论

相关推荐

    GNU gcc使用教程

    - **-fPIC 编译选项**:生成位置无关代码,适用于动态链接库。 - **-static 编译选项**:链接静态库而不是动态库,使得二进制文件完全自包含。 #### 6. AT&T的汇编格式 AT&T汇编格式与Intel汇编格式不同,主要区别...

    Linux平台gcc和动态共享库的基础知识

    Linux下的可执行文件通常依赖于动态链接库(Dynamic Shared Library),这些库在程序运行时被加载,以节省内存空间和磁盘空间。通过`ldd`命令可以查看`hello`程序所依赖的动态链接库,如libc.so.6和ld-linux-x86-64....

    GNU GCC 开发教程

    ### GNU GCC 开发教程知识点详解 #### 一、GCC简介 **GNU简介:** - **全称**: GNU Compiler Collection (GCC) - **起源**: 由Richard Matthew Stallman于1985年发起,旨在创建一套与Unix兼容的免费软件集合。 - *...

    linux下用gcc生成静态库和动态库.doc

    3. 在使用动态库的程序中,除了指定库路径(`-L`)和库名(`-l`),还需要确保运行环境能找到动态库,通常通过设置`LD_LIBRARY_PATH`环境变量或安装到系统默认的动态链接库路径。 4. 运行程序,如`./main`,如果...

    Linux平台gcc和动态共享库的基础知识 收集

    本篇文章将深入探讨Linux环境下GCC的使用以及动态共享库的基础知识。 首先,GCC的工作流程可以分为预处理、编译、汇编和链接四个阶段。预处理阶段处理宏定义、条件编译指令和包含文件;编译阶段将源代码转换为汇编...

    Linux下如何用GCC编译动态库.docx

    - 动态库(.so文件):在程序运行时被加载,磁盘上只需要一份库副本,节省空间,更新或修复库无需重新编译所有程序,但程序运行速度可能稍慢,因为需要在运行时进行动态链接。 3. 创建自己的库 创建动态库的步骤...

    boost_1_55_0编译的动态链接库

    动态链接库是一种可执行文件格式,允许程序在运行时加载和使用库功能,而不是在编译时静态地将库代码合并到程序中。 Boost库的1.55.0版本可能包含了多个子库,这些子库涵盖了各种不同的用途,如线程管理、智能指针...

    使用gcc建立并调用静态库与动态库

    然后使用GCC链接动态库: ```bash gcc -o hello main.c -L. -lhellod ``` 运行结果如下: ``` printindynamicway:Hello World! ``` 需要注意的是,在不同的操作系统中,动态库的处理方式有所不同。例如,在...

    libgmp 5.0.4 dll&lib; 动态链接库

    动态链接库(libgmp-10.dll)在程序运行时被加载,减少了程序的存储需求,因为多个程序可以共享同一份库的内存映像。静态链接库(如libgmp.dll.a)则在编译时与代码合并,生成的可执行文件包含了库的所有功能,不...

    qt release基本动态链接库文件MINGWM10.DLL QtGui4.dll QtCore4.dll phonon4.dll

    在Windows环境下部署QT应用程序时,确保这些动态链接库文件存在于执行路径或系统路径下至关重要,因为它们包含了程序运行所必需的代码和数据。如果在没有这些库的情况下尝试运行QT应用程序,系统将无法找到必要的...

    MinGw64编译JsonCpp动态/静态链接库的工程

    这两种方式各有优缺点:动态链接库可以减少应用程序的大小,但需要确保系统路径中有相应的.dll文件;静态链接库则避免了依赖问题,但可能导致最终程序体积增大。 在MinGW64环境下编译JsonCpp,首先需要安装MinGW64...

    AVR单片机GCC程序设计

    介绍了如何在AVR单片机上实现对其他类型单片机的编程,如AT89S52,这涉及到硬件接口的设计和下位机程序的编写,展示了GCC在复杂项目中的应用能力。 #### 7. 硬件TWI端口编程 TWI(Two-Wire Interface)是一种双向...

    pthread GNU的一个线程库

    这里的“-l”前缀是GCC链接库时的标志,表示链接指定的库。 关于标签,“库”是指程序开发中复用的代码集合,通常以静态库(如libpthreadGC2.a)或动态库的形式存在。“线程”(Thread)是操作系统分配CPU时间的...

    gnu 链接脚本学习资源

    7. **高级主题**:探讨更复杂的用法,如动态链接、段对齐、共享对象等。 通过这些学习资源,你可以逐步掌握GNU链接脚本的精髓,不仅能够理解和编写链接脚本,还能灵活应用于实际的GPIO编程和其他嵌入式系统开发中。...

    GCC.rar_GCC 中文手册_gcc 手册_gcc中文手册_gnu c 中文

    **链接库** GCC可以链接到外部库,如系统库或用户自定义库。使用 `-l` 选项指定库名,例如 `-lm` 用于链接数学库。库文件通常是`.a`(静态库)或`.so`(动态库)格式。 **预处理、编译、汇编和链接** GCC的工作...

    gcc gdb 入门 以及合并linux静态库的方法

    本文将介绍如何使用GCC进行编译和链接,GDB的基本调试技巧,以及Linux下静态库和动态库的创建、使用和合并。 ### GCC的简单使用 **1. 创建可执行程序** - 编写源代码文件,例如`test.c`,包含主函数`main()`。 - ...

    gnu下的编译手册

    在软件开发中,静态库是预先编译并链接到目标代码中的库文件,与动态库不同,它们在运行时不需要单独的库文件。AR可以方便地管理这些静态库,添加、删除成员,并创建索引。 AS则是GNU的汇编器,它将高级语言(如C或...

Global site tag (gtag.js) - Google Analytics