小编Cra*_*ers的帖子

让GNU链接器(ld)导出符号的问题

我正在使用某些GNU工具,即GNU C++编译器(g ++)和GNU链接器(ld)来创建共享库(.so)文件以及二进制可执行文件.

二进制可执行文件利用该dlopen函数在运行时动态加载共享库文件.除此之外,共享库文件需要调用ToolboxManager::registerToolbox在二进制可执行文件中定义的特定类方法(被调用).通过强制二进制可执行文件导出类方法来实现这一点,而类方法又通过链接二进制可执行文件和以下命令行选项在链接时完成;

-Wl,--dynamic-list=${top_srcdir}/dynamic_symbol_table.txt
Run Code Online (Sandbox Code Playgroud)

文件${top_srcdir}/dynamic_symbol_table.txt包含以下内容;

{
  extern "C++"
  {
    "ToolboxManager::registerToolbox*";
  };
};
Run Code Online (Sandbox Code Playgroud)

请注意在文件中使用星号(*)来强制链接器导出所有以#开头的符号ToolboxManager::registerToolbox.

当我nm -C -g ./a.out在生成的二进制可执行文件上运行GNU nm实用程序()时,它显示有关上述类方法的以下信息;

08053da0 T ToolboxManager::registerToolbox  
           (  
            std::string&,  
            std::string&,  
            std::map  
            <  
             std::string,  
             Factory_DSPB_Base*,  
             std::less  
             <  
              std::string  
             >,  
             std::allocator  
             <  
              std::pair  
              <  
               std::string const,  
               Factory_DSPB_Base*  
              >  
             >  
            >&  
           )
Run Code Online (Sandbox Code Playgroud)

或者,如果如上所述调用nm实用程序,但这次不使用-C命令行开关;

08053da0 T _ZN14ToolboxManager15registerToolboxERSsS0_RSt3mapISsP17Factory_DSPB_BaseSt4lessISsESaISt4pairIKSsS3_EEE
Run Code Online (Sandbox Code Playgroud)

到目前为止,这看起来很好.类方法定义前面的"T" ToolboxManager::registerToolbox表示该方法位于文件的Text/Code部分.

同样,如果我nm -C -g ./toolbox.so在共享库文件上运行nm实用程序(),它会显示有关上述类方法的相同信息;

U ToolboxManager::registerToolbox
  (
   std::string&,
   std::string&,
   std::map
   <
    std::string,
    Factory_DSPB_Base*,
    std::less
    <
     std::string
    >, …
Run Code Online (Sandbox Code Playgroud)

linker gnu ld

7
推荐指数
1
解决办法
2725
查看次数

标签 统计

gnu ×1

ld ×1

linker ×1