【问题标题】:Symbols in shared libraries共享库中的符号
【发布时间】:2015-08-03 10:30:02
【问题描述】:

我已经完成this tutorial here 学习如何生成共享库。我添加了一些较小的东西,因为我想测试一些东西。以下是ma源代码:

强文本

#ifndef foo_h__
#define foo_h__

void foo(void);

class CFoo
{
public:
    void fooing1();
    void fooing2(int a);
    void fooing3(int a, int b = 0);
};

#endif      // foo_h__

foo.cpp

#include <stdio.h>
#include "foo.h"

void foo(void)
{
    puts("Hello, I'm a shared library");
}

void CFoo::fooing1()
{
    puts("CFoo::fooing1()");
}

void CFoo::fooing2(int a)
{
    printf("CFoo::fooing2(%d)\n", a);
}

void CFoo::fooing3(int a, int b)
{
    printf("CFoo::fooing3(%d, %d)\n", a, b);
}

ma​​in.c

#include <stdio.h>
#include "foo.h"

int main(void)
{
    puts("This is a shared library test...");
    foo();

    CFoo *foo1 = new CFoo();
    foo1->fooing1();
    foo1->fooing2(12);
    foo1->fooing3(1);
    foo1->fooing3(1, 2);
    delete foo1;


    return 0;
}

还有构建脚本

g++ -c -Wall -Werror -fpic foo.cpp
g++ -shared -o libfoo.so foo.o
g++ -Wall -o test main.c -lfoo -L.

输入命令 nm -D libfoo.so | c++filt 时,我得到以下输出:

 0000000000201040 B __bss_start
                  w __cxa_finalize
 0000000000201040 D _edata
 0000000000201048 B _end
 0000000000000818 T _fini
                  w __gmon_start__
 0000000000000640 T _init
                  w _ITM_deregisterTMCloneTable
                  w _ITM_registerTMCloneTable
                  w _Jv_RegisterClasses
                  U printf
                  U puts
 0000000000000796 T foo()
 00000000000007a8 T CFoo::fooing1()
 00000000000007c2 T CFoo::fooing2(int)
 00000000000007ea T CFoo::fooing3(int, int)

我有两个问题:

1) 为什么printfputs 在它们的函数名前有一个U?而函数foo()CFoo::fooing1()CFoo::fooing2(int)CFoo::fooing3(int, int) 的函数名前确实有T

2) 如何在CFoo 函数之前获得U

【问题讨论】:

  • 你应该阅读过nm command手册页。
  • 您可以使用-C|--demangle nm 选项而不是通过c++filt 进行管道传输。

标签: c++ c gcc shared-libraries


【解决方案1】:

letter U means 符号 printfputs 在您生成的库代码中未定义。这是正常的,因为它们是在另一个共享库中定义的。

字母T表示代码在库文件中定义(文本部分实际上对应于代码;不应与数据部分混淆)。

如果 CFoo 函数旨在成为您共享库的核心内容,您最好避免在您的库中将它们设为 U。如果你仍然想实现这一点:

  • 保留在类头中声明的 CFoo 函数
  • foo.cpp 中完全删除它:代码将编译但缺少函数(即它根本没有在库文件中定义)
  • 但从foo.cpp 中的另一个CFoo 函数调用此函数:代码将编译,这次库文件将将此函数定义为 U:一个经常声明的符号,是必需的,但还没有找到。

【讨论】:

  • 我需要将CFoo 函数转换为U,因为我想生成一个我遇到的问题的小例子。
猜你喜欢
  • 2017-08-02
  • 2011-02-28
  • 2016-10-16
  • 2011-02-11
  • 1970-01-01
  • 2018-08-04
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多