将静态库和 .o 文件链接到共享库时,我遇到了缺少符号的问题。我检查了静态库的符号表,我需要的函数通常在表中列出,如下所示:
...
00000000 g F .text 000000b0 av_int2dbl
...
000000b0 g F .text 00000060 av_int2flt
但是当我生成共享库时,av_int2dbl
还有 av_int2flt
一些其他函数丢失(它们通常都列在静态符号表中),我使用了一种愚蠢的方法来解决这个问题,通过在 .o 文件中创建一个虚拟函数,并引用丢失的函数形式虚拟函数,共享库的DYNAMIC SYMBOL TABLE增加了一些以前漏掉的函数,但奇怪的是av_int2dbl
还是av_int2flt
漏掉了。
谁能告诉我,生成共享库时删除符号的原则是什么?
如果ld
将删除所有未引用的符号,为什么.o 文件中定义的函数(这些函数没有从其他位置引用)仍然存在于共享库中?为什么av_int2dbl
和av_int2flt
在虚拟函数中显式调用,而反汇编丢失了这两个函数?
以下是 .o 文件中定义的虚拟函数:
int my_dummy_funcs(void)
{
av_rdft_init(0x01,0x1);
av_rdft_calc(NULL, NULL);
av_rdft_end(NULL);
av_int2dbl(1);
av_int2flt(1);
av_resample(NULL,NULL,NULL,NULL,0,0,0);
av_resample_close(NULL);
av_resample_init(0,0,0,0,0,1.0);
return 0;
}
反汇编虚拟函数如下:
0008951c <my_dummy_funcs>:
8951c: e3a00001 mov r0, #1
89520: e92d40d0 push {r4, r6, r7, lr}
89524: e1a01000 mov r1, r0
89528: e3a04000 mov r4, #0
8952c: e24dd010 sub sp, sp, #16
89530: eb03a21e bl 171db0 <av_rdft_init>
89534: e1a01004 mov r1, r4
89538: e1a00004 mov r0, r4
8953c: e3a06000 mov r6, #0
89540: eb03a22f bl 171e04 <av_rdft_calc>
89544: e1a00004 mov r0, r4
89548: eb03a231 bl 171e14 <av_rdft_end>
8954c: e1a01004 mov r1, r4
89550: e1a02004 mov r2, r4
89554: e1a03004 mov r3, r4
89558: e1a00004 mov r0, r4
8955c: e58d4000 str r4, [sp]
89560: e58d4004 str r4, [sp, #4]
89564: e3a07000 mov r7, #0
89568: e58d4008 str r4, [sp, #8]
8956c: eb0e4a62 bl 41befc <av_resample>
89570: e1a00004 mov r0, r4
89574: e3437ff0 movt r7, #16368 ; 0x3ff0
89578: eb0e4a4a bl 41bea8 <av_resample_close>
8957c: e1a00004 mov r0, r4
89580: e1a01004 mov r1, r4
89584: e1a02004 mov r2, r4
89588: e1a03004 mov r3, r4
8958c: e58d4000 str r4, [sp]
89590: e1cd60f8 strd r6, [sp, #8]
89594: eb0e495f bl 41bb18 <av_resample_init>
89598: e1a00004 mov r0, r4
8959c: e28dd010 add sp, sp, #16
895a0: e8bd80d0 pop {r4, r6, r7, pc}