Linux下gcc编译, 控制动态库导出函数

转载 2013年12月05日 14:42:42

根据说明文档“How To Write Shared Libraries"介绍,

有四种方法:

1. 在方法声明定义时,加修饰:__attribute__((visibility("hidden")))

2. gcc 在链接时设置 -fvisibility=hidden,则不加 visibility声明的都默认为hidden; gcc默认设置 -fvisibility=default,即全部可见;

3. 使用export map,gcc -Wl,--version-script=export.map, 在export.map中指定

{

global:export_func;

local:*;

};

则除了export_func外,全部为内部可见;

4. 使用libtool的export-symbols选项,没试过,略;

 

以上方法,对于gcc的visibility功能需要 gcc 4以上版本,

常见的宏,用于等同于 windows下的 __declspec(dllexport)(摘自:http://gcc.gnu.org/wiki/Visibility):


#if defined _WIN32 || defined __CYGWIN__

  #ifdef BUILDING_DLL

    #ifdef __GNUC__

      #define DLL_PUBLIC __attribute__((dllexport))

    #else

      #define DLL_PUBLIC __declspec(dllexport) // Note: actually gcc seems to also supports this syntax.

    #endif

  #else

    #ifdef __GNUC__

      #define DLL_PUBLIC __attribute__((dllimport))

    #else

      #define DLL_PUBLIC __declspec(dllimport) // Note: actually gcc seems to also supports this syntax.

  #endif

  #define DLL_LOCAL

#else

  #if __GNUC__ >= 4

    #define DLL_PUBLIC __attribute__ ((visibility("default")))

    #define DLL_LOCAL  __attribute__ ((visibility("hidden")))

  #else

    #define DLL_PUBLIC

    #define DLL_LOCAL

  #endif

#endif

实践中发现几个有意思的东西[实验环境为ubuntu 9.10, gcc 4.4.1]:

1. gcc -fvisibility=hidden 只在链接时传入的.c文件起作用,对.o文件不其作用;

比如test.c test1.c, 使用以下命令:

gcc -shared -fvisibility=hidden -o test.so test.c test1.c

和命令

gcc -c test.c test1.c

gcc -shared -fvisibility=hidden -o test.so test.o test1.o

生成的test.so中的对应可见性是不一样的, 使用“readelf -s test.so”查看发现:

第一个达到预期目的,即将两个.c文件中的functions设为HIDDEN,

而第2个则不行,-fvisibility=hidden不起作用;

再用gcc -shared -fvisibility=hidden -o test.so test.o test1.c

生成的so,则可发现test1.c中的函数为HIDDEN,但test.o中的函数仍为DEFAULT;



2. 实验通过export map的方法,通过readelf总是发现函数仍然可见,后来搜索发现:

需同时使用ld --retain-symbols-file --version-script 两个选项方能达到 使得elf文件中的.dynsym和.symtab

中的符号表都得到控制;其中--retain-symbols-file控制静态符号表,--version-script则对应dynamic符号表;


转自:http://blog.csdn.net/zdragon2002/article/details/6061962

Linux下gcc编译控制动态库导出函数小结 .

根据说明文档“How To Write Shared Libraries"介绍, 有四种方法: 1. 在方法声明定义时,加修饰:__attribute__((visibility("hidden"...
  • wzsy
  • wzsy
  • 2014年01月22日 14:30
  • 445

Linux下gcc编译控制动态库导出函数小结

根据说明文档“How To Write Shared Libraries"介绍, 有四种方法: 1. 在方法声明定义时,加修饰:__attribute__((visibility("hid...
  • funkri
  • funkri
  • 2013年09月06日 16:50
  • 712

windows/Linux下动态库导出函数小结

1. 在方法声明定义时,加修饰:__attribute__((visibility("hidden"))) 2. gcc 在链接时设置 -fvisibility=hidden,则不加 visib...
  • tanningzhong
  • tanningzhong
  • 2015年08月19日 15:40
  • 437

Linux从动态库导出函数

为 Linux 应用程序编写 DLL 在仅仅只会编写插件的时候为什么要编写整个应用程序? Allen Wilson (wilsona@us.ibm.com), 电子商务设计师, IBM...
  • stonesharp
  • stonesharp
  • 2012年08月22日 09:53
  • 2331

控制linux动态链接库导出函数

http://blog.csdn.net/wangjingfei/article/details/5693535 参考:http://www.lampchina.NET/article/ht...
  • yu704645129
  • yu704645129
  • 2016年11月15日 15:00
  • 802

动态链接库导出函数示例

第一步,新建项目,选择win32项目(不是win32控制台程序),命名为ClassDll根据导向选择DLL,完成。 第二步,新建一个头文件,命名为 ClassDll.h,在这个头文件里添加下面的...
  • shufac
  • shufac
  • 2014年05月07日 23:21
  • 1506

动态链接库中导出函数的调用

动态链接库中的函数导出成功后,其它EXE程序要使用导出函数,就会涉及到如何调用动态链接库。 调用DLL也分为两种方法:隐式调用和显示调用: 1、隐式调用: 隐式链接的特点是由编译器完成对DLL的加载和...
  • u012372584
  • u012372584
  • 2017年03月27日 10:56
  • 256

动态库函数的导出

一、DLL程序入口点函数: CUI控制台程序(不是DOS):main GUI用户界面程序:WinMain DLL程序入口点函数:DllMain,注意:大小写是区别的(仅导出资源的DLL可以没有Dll...
  • u012372584
  • u012372584
  • 2017年03月27日 10:35
  • 337

VS2010下Qt导出动态库的编写

详细介绍Qt中动态链接库的使用
  • chenchong_88
  • chenchong_88
  • 2015年02月01日 20:38
  • 1424

gcc编译工具生成动态库和静态库之一----介绍

gcc编译工具生成动态库和静态库
  • yanlaifan
  • yanlaifan
  • 2016年08月12日 16:32
  • 1393
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下gcc编译, 控制动态库导出函数
举报原因:
原因补充:

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