我的问题很清楚:
如何在使用-O2时获取内联函数的编译指令?我尝试使用readelf来获取源代码行和二进制代码地址之间的映射。但是对于调用内联函数的行,没有映射。
那么,可以使用哪种编译器选项或任何方法?
事实上,我觉得必须有一种方法告诉gcc转储函数的所有起始和结束地址。有人有线索吗? 谢谢!
让我重新说一下我的意图: 我想配置gcc,以便它可以告诉我从哪个函数编译的某组指令。是的,就是这样。
答案 0 :(得分:0)
如果文件是内联的,则它没有开始和结束功能。每次调用它时,整个代码都会被重复调用。这就是内联的目的。
每次调用它时,它都会有不同的起始和结束地址。这就是为什么没有映射。
如果你要做的就是提取该函数的程序集,那么不要让它内联,然后你就能完全看到它。但是,根据编译器如何优化代码,这可能与内联函数时生成的程序集不完全相同。
答案 1 :(得分:0)
由于该函数是内联,因此它不再是具有单个开始和结束的正常函数。它的身体已被插入你所称的任何地方。
答案 2 :(得分:0)
GCC通常不会为内联函数发出代码(在高优化级别)。因为内联函数(按意图)应该内联到它们的调用者中,并且没有任何目的将它们的代码保存在目标文件中。
但是,C ++标准不要求这样做。 C ++标准要求的是函数指针可以指向任何函数,包括那些内联!但是函数指针在GCC中有一个具体的表示,它是指向物理loaction的指针。这意味着,要使用指向内联函数的指针,它应该具有特定的地址。
所以,要获取内联函数的地址,你应该......,在代码中获取它的地址!这将使编译器实例化内联函数并为其发出汇编代码。还有更多的方法可以释放自己的身体。见GCC docs:
...由于各种原因,无法集成[内联函数]的某些调用(特别是,无法集成函数定义之前的调用,也无法在定义中进行递归调用)。如果存在非集成调用,则该函数将像往常一样编译为汇编代码。如果程序引用其地址,则必须像往常一样编译该函数,因为无法内联。
这是一段确认这一点的代码:
inline int uiopuiop()
{
return 4;
}
typedef int (*fptr)();
int main()
{
fptr f = uiopuiop;
return uiopuiop();
}
如果您编译C代码,您还可以将-fkeep-inline-functions
用于static-inline
个函数。
答案 3 :(得分:0)
内联函数不仅(经常)内联,而且在内联之后完成各种优化。例如,如果sum
是明显的内联函数,则添加两个整数,sum(3,4)
将被7
替换,并且程序中不会出现对sum的调用,甚至可能无法给出位置为了它。
因此,您真的不想知道对内联函数的内联调用。