• GCC生成动态链接库(.so文件):-shared和-fPIC选项


    Linux 下动态链接库(shared object file,共享对象文件)的文件后缀为.so,它是一种特殊的目标文件(object file),可以在程序运行时被加载(链接)进来。使用动态链接库的优点是:程序的可执行文件更小,便于程序的模块化以及更新,同时,有效内存的使用效率更高。

    GCC 生成动态链接库

    如果想创建一个动态链接库,可以使用 GCC 的-shared选项。输入文件可以是源文件、汇编文件或者目标文件。

    另外还得结合-fPIC选项。-fPIC 选项作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code);这样一来,产生的代码中就没有绝对地址了,全部使用相对地址,所以代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

    例如,从源文件生成动态链接库:

    $ gcc -fPIC -shared func.c -o libfunc.so
    

     从目标文件生成动态链接库:

    $ gcc -fPIC -c func.c -o func.o
    $ gcc -shared func.o -o libfunc.so
    

     -fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。

    GCC 将动态链接库链接到可执行文件

    如果希望将一个动态链接库链接到可执行文件,那么需要在命令行中列出动态链接库的名称,具体方式和普通的源文件、目标文件一样。请看下面的例子:

    $ gcc main.c libfunc.so -o app.out
    

     将 main.c 和 libfunc.so 一起编译成 app.out,当 app.out 运行时,会动态地加载链接库 libfunc.so。

    当然,必须要确保程序在运行时可以找到这个动态链接库。你可以将链接库放到标准目录下,例如 /usr/lib,或者设置一个合适的环境变量,例如 LIBRARY_PATH。不同系统,具有不同的加载链接库的方法。

  • 相关阅读:
    iOS利用通知(NSNotification)进行传值
    yum gd linux
    discuz搬家
    快速上传到rackspace cdn工具turbolift swift 安装
    linux 文件属性、权限、所有人、所属组
    Tar压缩文件
    lamp安装手稿
    Mysql导出导入相关操作记录
    How to Install a Language Pack
    centos下开启htaccess
  • 原文地址:https://www.cnblogs.com/liuzhenbo/p/11030946.html
Copyright © 2020-2023  润新知