gpt4 book ai didi

linux - 程序在Linux下运行时如何知道所有函数(包括共享库)的地址和大小?

转载 作者:太空宇宙 更新时间:2023-11-04 04:41:13 25 4
gpt4 key购买 nike

程序已经加载到内存中。我需要知道程序源代码中的所有函数地址及其大小(使用 nm 这样的工具就可以了)。所有函数的意思是,包括加载的共享库函数,如“printf”,并且应该是真正的函数地址,而不是PLT地址。我怎样才能实现它?

最佳答案

我不确定你的问题是否总是有意义,即使 Employed Russian's answer给出了一个实用的线索。

首先,剥离的可执行文件或库中的static 函数(包括libc 等共享库内的static 函数)没有可见的 ELF符号

其次,一些编译器能够(使用函数克隆或其他技术)在强烈优化时具有不连续的函数代码,例如因为两个函数共享一段公共(public)机器代码。从某种意义上来说,编译器优化时也会发生这种情况tail-calls .

大多数编译器都能够内联函数调用(特别是未定义为内联的函数)。与link-time optimization (例如,编译的代码gcc -flto -O3链接)甚至可能在多个翻译单元之间发生。

您可以尝试使用 dladdr(3) & backtrace(3) 。您会发现函数代码可能具有令人惊讶甚至定义不明确的“边界”。

关于linux - 程序在Linux下运行时如何知道所有函数(包括共享库)的地址和大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27048249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com