Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何告诉编译器在每个C函数上填充特定数量的字节?_Linux_Gcc_Padding_Self Modifying - Fatal编程技术网

Linux 如何告诉编译器在每个C函数上填充特定数量的字节?

Linux 如何告诉编译器在每个C函数上填充特定数量的字节?,linux,gcc,padding,self-modifying,Linux,Gcc,Padding,Self Modifying,我正在尝试一些实时插装,我看到有一个链接器选项-call nop=prefix nop,但它有一些限制,因为它只与get函数一起工作(我不知道如何强制编译器生成get函数,也不确定出于性能原因这是否是个好主意),-调用nop=*不能填充超过1个字节 理想情况下,我希望看到一个编译器选项来填充任何特定数量的字节,并且编译器仍将执行所有正常的函数对齐 一旦有了这个pad区域,我就可以在运行时重用这些padding区域来存储一些值或重定向控制流 另外,我相信Linux内核也使用类似的技巧来动态启用一些

我正在尝试一些实时插装,我看到有一个链接器选项
-call nop=prefix nop
,但它有一些限制,因为它只与get函数一起工作(我不知道如何强制编译器生成get函数,也不确定出于性能原因这是否是个好主意),
-调用nop=*
不能填充超过1个字节

理想情况下,我希望看到一个编译器选项来填充任何特定数量的字节,并且编译器仍将执行所有正常的函数对齐

一旦有了这个pad区域,我就可以在运行时重用这些padding区域来存储一些值或重定向控制流


另外,我相信Linux内核也使用类似的技巧来动态启用一些软件跟踪点。

我通过在汇编文件中实现自己的
mcount
函数,并使用
-pg
编译代码来实现这一目标。正确的选择是

  • -fpatchable function entry=N[,M]

    在每个函数的开始处生成N个NOP,函数入口点位于Mth
    NOP
    之前。如果省略M,则默认为0,因此函数入口仅指向第一个
    NOP
    处的地址。如果代码段是可写的,
    NOP
    指令保留了额外的空间,可用于在运行时修补任何所需的检测。通过NOP的数量间接控制空间量;使用的NOP指令对应于内部GCC后端接口发出的指令
    gen_NOP
    。此行为是特定于目标的,也可能取决于体系结构变量和/或其他编译选项

它将插入N个单字节0x90 NOPs,因此性能不如它应该的好,但在这种情况下,您可能不关心这一点,因此该选项应该可以正常工作