当前位置:  技术问答>linux和unix

[请教]关于共享库函数导出问题

    来源: 互联网  发布时间:2015-11-18

    本文导语:  本人对linux开发不熟悉,请大家不吝赐教。 在一个动态(共享)库中,有部分函数是只在内部使用,因此不能让用户看到这些接口。 在window下,开发标准dll时,可以使用MS提供的扩展语法dllexport将dll中的接口导出。 ...

本人对linux开发不熟悉,请大家不吝赐教。

在一个动态(共享)库中,有部分函数是只在内部使用,因此不能让用户看到这些接口。
在window下,开发标准dll时,可以使用MS提供的扩展语法dllexport将dll中的接口导出。
没有dllimport声明的函数就无法被外部使用。

但在linux上,生成的共享库(.so)如何能做到同样的效果? 目前我发现生成的.so中,nm可以看到所有的函数。

请指教!谢谢!

|
对于内联函数的展开,每个编译器的实现略有不同,的确,如果内联函数过长,会被编译器当作普通函数来产生目标文件,宏与内联会让产生的代码膨张!!!!

对于static的限制,不仅作用于编译期,而且还会作用于连接阶段,目标文件中会有一个符号段,这里会对每个比如全局函数,全局变量,外部函数,外部变量等,在连接时会用到这种信息,如果你的一个函数由static关键字修饰,在连接时,若外部需要这个函数,连接时会报错,如果两个库中都有同一个全局函数名称,连接时根据搜索路径,如果先找到一个库中的相应函数,就会停止查找,因此就忽略了第二个库的函数,这种不好之处由C++中的命名空间进行解决的,当然,用户在使用你提供的库时,可以突破这种static的限制,就是修改目标文件的符号表,把static类型修改成全局类型,这样就让连接器认为是真的可导出的全局变量。若不相信,大家可以写代码进行测试

再说一下strip,在LINUX下通过strip的帮助看到以下信息:
[root@localhost root]# strip --help
Usage: strip  in-file(s)
 Removes symbols and sections from files
 The options are:
  -I --input-target=      Assume input file is in format 
  -O --output-target=     Create an output file in format 
  -F --target=            Set both input and output format to   -p --preserve-dates              Copy modified/access timestamps to the output  -R --remove-section=       Remove section  from the output
  -s --strip-all                   Remove all symbol and relocation information
  -g -S -d --strip-debug           Remove all debugging symbols
     --strip-unneeded              Remove all symbols not needed by relocations
  -N --strip-symbol=         Do not copy symbol 
  -K --keep-symbol=          Only copy symbol 
  -x --discard-all                 Remove all non-global symbols
  -X --discard-locals              Remove any compiler-generated symbols
  -v --verbose                     List all object files modified
  -V --version                     Display this program's version number
  -h --help                        Display this output
  -o                         Place stripped output into 
大家注意-x.-X选项,这就是可以去掉某些符号声明,从而让nm看不到你想要隐藏的信息,也让用户看不到相应信息,还有-K选项,它可以用于伪装,给用户造成假象,其原理也是通过修改符号表来实现的!!!

结论:如果用户想要别人的程序不连接你的某些函数,用static关键字已足够,如果你想要隐葳函数名称,推荐你使用strip -x或者strip -X,但这种方法也不起根本性的作用,如果人家知道你内部的函数,完全可以再修改你的目标文件的符号表来重建相关函数声明,从而可以让用户程序连接你的代码。当然,没有用户会这样去做的!!!最彻底的办法莫过于将你的函数用宏的方式直接就地展开,这样用户就没有任何办法使用你的函数了!!!!!当然这样的后果就是造成代码膨胀,关键是LZ的需求是什么!!!!!

|
tb01412(tb)分析的非常好,赞一个:)
楼主的需求是不明确。
static在elf格式里被放在local符号区,只能在本模块内使用,可以起到屏蔽的作用,但如果是一个内部使用的公用函数,这样会导致所有使用该函数的代码不得不放在一个源文件里,从而引起整个代码的物理架构的混乱。

|
用宏定义来做限制,看到也不能用。

|
static限制

    
 
 

您可能感兴趣的文章:

  • 请教:如何将SQLSERVER数据库中所有表结构导出???
  • 请教:使用什么命令查看导出的环境变量?
  • 高分请教:怎样在Kdevelop不能够Trace构造函数?(其他函数可以Trace)
  • 请教:javascript 里有没有时间循环执行的函数,如我按住鼠标触发mousedown 事件函数时,反复执行我写的一个函数?
  • 请教semop()函数的用法、含义
  • 请教套接字中的select()函数问题
  • 请教一个函数入口处的汇编问题(压栈问题)
  • 请教一个关于ftw函数的问题!
  • 100分请教高手一个bash函数
  • 请教signal函数的用法!
  • 请教exec系列函数的用法
  • 请教UNIX C字符输入的检测函数?
  • 请教关于dlopen,动态库连接程序的输出函数
  • 请教select函数
  • (菜鸟请教)还有修改/etc/passwd文件用什么函数呢?
  • linux下time函数问题请教高手
  • 请教一个网络编程问题,accept函数的,在线等,急。。。
  • 请教一个取时间的函数,急!!!!!!!!!!!!!!!!
  • 请教,JavaScript中能不能调用JSP写的函数?
  • 请教:clock_gettime函数的使用问题
  • 请教 变量= { function:函数名};什么意思
  • signal 函数请教
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,,,一定要看!!一定要看!! iis7站长之家
  • 请教POSIX 和 System V 实现的内存共享的相同及不同之处
  • 请教共享库运行时加载的问题
  • 菜鸟请教有关共享内存管理的一个问题
  • 请教裁剪操作系统时,共享库的裁剪
  • 请教一个关于linux共享库版本化的问题
  • linux 共享内存 请教
  • 请教不需要网络使虚拟机Virtual PC与主机共享的方法
  • 请教高手:关于系统共享库的升级
  • 请教linux共享上网的相关问题!!!急~~~~~~~
  • 请教一下共享内存的问题
  • 请教有关samba共享名大小写的问题
  • 请教高手,一个关于共享内存的问题。
  • 请教linux共享上网的问题!!!在线等,问题解决马上结贴
  • 请教一个关于内存分配的问题(系统和DMA共享一块物理内存空间)
  • 请教一个内存共享的问题
  • 请教redhat9 共享ADSL上网设置
  • 高分请教 ???怎么配置Linux才能和Windows共享ASDl上网(在线等待)
  • 请教fedora 1 双网卡共享adsl问题,郁闷好几天了
  • 请教:java bean在实例在各个页面共享???
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3