gcc选项:获取内联函数的开始和结束地址

gcc选项:获取内联函数的开始和结束地址,gcc,Gcc,我的问题很清楚: 使用-O2时如何获取内联函数的编译指令?我尝试readelf获取源代码行和二进制代码地址之间的映射。但是调用内联函数的行根本没有映射 那么,可以使用什么编译器选项或任何方法呢 事实上,我觉得必须有一种方法告诉gcc转储函数的所有开始和结束地址。有人有线索吗? 谢谢 --- 让我重新表述一下我的意图: 我想配置gcc,以便它可以告诉我从哪个函数编译特定的指令集。是的,很简单。如果文件是内联的,那么它就没有开始和结束函数。每次调用它时,整个代码都会复制到调用它的地方。这就是内联的目

我的问题很清楚:

使用-O2时如何获取内联函数的编译指令?我尝试readelf获取源代码行和二进制代码地址之间的映射。但是调用内联函数的行根本没有映射

那么,可以使用什么编译器选项或任何方法呢

事实上,我觉得必须有一种方法告诉gcc转储函数的所有开始和结束地址。有人有线索吗? 谢谢

--- 让我重新表述一下我的意图:
我想配置gcc,以便它可以告诉我从哪个函数编译特定的指令集。是的,很简单。

如果文件是内联的,那么它就没有开始和结束函数。每次调用它时,整个代码都会复制到调用它的地方。这就是内联的目的

每次调用它时,它都会有不同的开始和结束地址。这就是为什么没有映射


如果您所要做的只是提取该函数的程序集,那么不要将其内联,这样您就能够准确地看到它。但是,根据编译器优化代码的方式,这可能与函数内联时生成的程序集不完全相同。

由于函数是内联的,因此它不再是具有单一开始和结束的普通函数。它的主体已经插入到您调用它的任何地方。

GCC通常不会为内联函数发出代码(在高优化级别)。因为内联函数,根据意图,应该内联到它们的调用者中,而将它们的代码保存在对象文件中是没有意义的

但是,这不是C++标准所要求的。C++标准要求的是函数指针可以指向任何函数,包括那些函数!但是函数指针在GCC中有一个具体的表示,它是指向物理动作的指针。这意味着,要使用指向内联函数的指针,它应该有一个特定的地址

所以,要获得内联函数的地址,您应该,ehm在代码中获取其地址这将使编译器实例化内联函数并为其发出汇编代码。还有更多的方式来释放他们的身体。见:

。。。由于各种原因,[内联函数]的某些调用无法集成(尤其是函数定义之前的调用无法集成,定义内的递归调用也无法集成)。如果存在非集成调用,则该函数将像往常一样编译为汇编代码。如果程序引用它的地址,函数也必须像往常一样编译,因为地址不能内联

这里有一个代码可以证实这一点:

inline int uiopuiop()
{
  return 4;
}
typedef int (*fptr)();
int main()
{
  fptr f = uiopuiop;
  return uiopuiop();
}

如果编译C代码,还可以对
静态内联
函数使用
-fkeep inline functions

内联函数不仅(通常)是内联的,而且在内联后会进行各种优化。例如,如果
sum
是添加两个整数的明显内联函数,
sum(3,4)
将替换为
7
,并且程序中不会出现对sum的调用,您甚至无法给出它的位置


因此,您确实不想知道对内联函数的内联调用

请您澄清一下,“函数的结束地址”是什么意思,以及您将如何使用它?