链接 静态库 和 .o 文件 生成 动态库中导出符号的问题

only_yestoday 2013-09-02 09:50:22
需求是这样的:假如我现在有两个文件 main.o 和 libmylib.a
main.o中包含对用户的接口函数
libmylib.a中包含有一些底层的API,主要为main.o服务。但是其中也有一些对用户开放的接口

现在我想把两者链接成一个动态库
gcc -shared main.o -L. -lmylib -o test.so

问题出来了,nm -D test.so时候,libmylib.a中没有被main.o调用函数符号,不可见

哪位高手能指点一二呢?小弟感激不尽~~~~~
...全文
305 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2013-09-11
  • 打赏
  • 举报
回复
下面的命令 gcc -shared main.o -L. -lmylib -o test.so 会把 libmylib.a中被main.o调用到的函数所在的.o的代码拷贝到test.so中; 注意:是以文件为单位的, 比如libmylib.a中的foo.o有一个函数被main.o中的函数调用的话, 整个foo.o都会拷贝进test.so中,结果就是foo.o中的外部符号,在test.so中都是可见的了。

#
# Makefile
#


all:
        gcc -fPIC -c *.c
        ar crv libfb.a foo.o bar.o
        gcc -shared -o libdemo.so demo.o -L. -lfb



/**
 * @file        bar.c
 * @brief       
 */

#include <stdio.h>

int bar(void)
{
        return 0;
}



/**
 * @file        demo.c
 * @brief       
 */

#include <stdio.h>

int foo(void);

int demo(void)
{
        foo();
        return 0;
}



/**
 * @file        foo.c
 * @brief       
 */

#include <stdio.h>


int foo(void)
{
        return 0;
}

int foo2(void)
{
        return 0;
}
nm libdemo.so 0000000000200690 a _DYNAMIC 0000000000200828 a _GLOBAL_OFFSET_TABLE_ w _Jv_RegisterClasses 0000000000200668 d __CTOR_END__ 0000000000200660 d __CTOR_LIST__ 0000000000200678 d __DTOR_END__ 0000000000200670 d __DTOR_LIST__ 0000000000000658 r __FRAME_END__ 0000000000200680 d __JCR_END__ 0000000000200680 d __JCR_LIST__ 0000000000200850 A __bss_start w __cxa_finalize@@GLIBC_2.2.5 0000000000000570 t __do_global_ctors_aux 0000000000000490 t __do_global_dtors_aux 0000000000200688 d __dso_handle w __gmon_start__ 0000000000200850 A _edata 0000000000200860 A _end 00000000000005a8 T _fini 0000000000000420 T _init 0000000000000470 t call_gmon_start 0000000000200858 b completed.6145 000000000000053c T demo 0000000000200850 b dtor_idx.6147 000000000000054c T foo 0000000000000557 T foo2 0000000000000510 t frame_dummy
糊涂的小白 2013-09-09
  • 打赏
  • 举报
回复
你看看这个吧 http://bbs.csdn.net/topics/390573281
only_yestoday 2013-09-09
  • 打赏
  • 举报
回复
顶顶,我要结贴,谁来说句话,说了就给分了
only_yestoday 2013-09-03
  • 打赏
  • 举报
回复
没人知道吗?顶一下

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧