链接 静态库 和 .o 文件 生成 动态库中导出符号的问题
来源: 互联网 发布时间:2017-04-24
本文导语: 需求是这样的:假如我现在有两个文件 main.o 和 libmylib.a main.o中包含对用户的接口函数 libmylib.a中包含有一些底层的API,主要为main.o服务。但是其中也有一些对用户开放的接口 现在我想把两者链接成一个动态库 g...
需求是这样的:假如我现在有两个文件 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调用函数符号,不可见
哪位高手能指点一二呢?小弟感激不尽~~~~~
main.o中包含对用户的接口函数
libmylib.a中包含有一些底层的API,主要为main.o服务。但是其中也有一些对用户开放的接口
现在我想把两者链接成一个动态库
gcc -shared main.o -L. -lmylib -o test.so
问题出来了,nm -D test.so时候,libmylib.a中没有被main.o调用函数符号,不可见
哪位高手能指点一二呢?小弟感激不尽~~~~~
|
下面的命令
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中都是可见的了。
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
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
int bar(void)
{
return 0;
}
/**
* @file demo.c
* @brief
*/
#include
int foo(void);
int demo(void)
{
foo();
return 0;
}
/**
* @file foo.c
* @brief
*/
#include
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
|
你看看这个吧
http://bbs.csdn.net/topics/390573281
http://bbs.csdn.net/topics/390573281
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。