1

将静态库和 .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_int2dblav_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}
4

1 回答 1

0

但是当我生成共享库时,av_int2dbl 和 av_int2flt 以及其他一些函数丢失了

最可能的原因:它们被标记为HIDDEN在常规符号表中,告诉链接器不要将它们导出到动态符号表中。

您可以通过运行来验证这个假设

readelf -s libfoo.a | grep av_int2dbl

(并学习使用readelf而不是objdump在 ELF 平台上使用)。

于 2013-01-27T16:59:09.170 回答