有时当我在.so文件上执行nm(例如,libstdc ++.so.6)时,它没有说明符号,我需要使用nm --dynamic.但对于其他一些.so文件,我可以看到没有--dynamic的符号.
医生说:
显示动态符号而不是普通符号.这仅对动态对象有意义,例如某些类型的共享库.
但令人困惑的是......共享库的"类型"需要什么 - 动态?这是如何确定的?在编译图书馆期间?我认为所有共享库都是动态的(我的意思是,可以在运行时动态加载),但似乎我的理解不太对.
Tux*_*ude 14
很有可能,如果您的符号未从共享库中导出,它最终会以normal symbol table而不是dynamic symbol table.
ELF文件中有许多类型的符号.
符号的一部分Normal Symbol table.这是从单纯的输出nm libabc.so或objdump --syms libabc.so.这些符号仅在静态链接期间使用.
符号的一部分Dynamic Symbol table.这是nm --dynamic libabc.so或的输出objdump --dynamic-syms libabc.so.动态符号表是运行时链接器/加载器使用的表,它绑定引用它们的ELF文件和定义它们的ELF文件之间的符号.static linker在将共享库与需要它的应用程序链接时,它也被使用.这是有助于在undefined symbol errors链接期间显示所有内容的组件.
Hidden symbols- 这些是使用标记的符号_attribute_ ((visibility("hidden"))).这些符号不会导出到外部,只能在库中使用.在链接步骤期间检查可见性,因此仅对共享库强制执行.默认可见性是public,即除非另有说明,否则将导出符号.可以使用-fvisibility=default|internal|hidden|protected.修改行为.
将默认ELF图像符号可见性设置为指定选项 - 除非在代码中覆盖,否则将使用此标记所有符号.使用此功能可以极大地改善共享对象库的链接和加载时间,生成更优化的代码,提供近乎完美的API导出并防止符号冲突.强烈建议您在分发的任何共享对象中使用它.尽管有命名法,但默认总是意味着公共,即; 可以从共享对象外部链接.protected和internal在实际使用中相当无用,因此唯一的其他常用选项将被隐藏.默认情况下if -fvisibility未指定为默认值,即将每个符号设为公共 - 这会导致与以前版本的GCC相同的行为.
这些技术的概述,它们的好处以及如何使用它们的地址是http://gcc.gnu.org/wiki/Visibility.
要回答你的问题,你何时会使用--dynamic选项nm,那就是你要列出共享库导出的所有符号,以及唯一可用于引用它们的ELF图像的符号.