从仅给出指针的编译代码中取回未导出的 C 函数名称。

Getting back a C function name, not exported, from compiled code given just pointer.

我正在尝试获取隐藏的 C 函数的函数名称,也就是未暴露在图像的符号 table 中。

我在 OS X 上执行此操作并使用 dladdr,当 dladdr returns 成功时,我检查了 dli_sname 字段,但它为 NULL。

有没有办法取回 C 函数名?据我了解,未导出的 C 函数最终被内联?

没有办法

内联与否,如果它不在符号 table 中,则如果它是使用调试信息构建的,则不会在其他任何地方存储名称,即使经过优化,它仍然是有时很难或不可能恢复。

您可以使用例如转储符号 table objdump 如果你很好奇,任何不存在的东西都无法通过 dladdr 获得。

未导出的函数不一定是内联的(否则你一开始就不会有函数地址),但它们不在符号 table 中,因此它们没有关联的名称。

除非您导出所有符号(例如 GCC 的 -export-dynamic),否则无法获取名称,但我猜您一开始就不会问是否可以这样做。如果它有调试信息,则可能可以解析它以获取名称。