如何告诉编译器在每个 C 函数上填充特定数量的字节?
How to tell compiler to pad a specific amount of bytes on every C function?
我正在尝试练习一些实时检测,我看到有一个链接器选项 -call-nop=prefix-nop
,但它有一些限制,因为它只适用于 GOT 函数(我不知道如何强制编译器生成 GOT 函数,不确定出于性能原因这是否是个好主意。)另外,-call-nop=*
不能填充超过 1 个字节。
理想情况下,我希望看到一个编译器选项来填充任何特定数量的字节,并且编译器仍将执行所有正常的函数对齐。
一旦我有了这个填充区域,我就可以在 运行 的时候重新使用这些填充区域来存储一些值或重定向控制流。
P.S。我相信 Linux 内核使用类似的技巧来动态启用某些软件跟踪点。
我通过在汇编文件中实现自己的 mcount
函数并使用 -pg
编译代码来实现这个目标。
-pg
适用于 profile-guided optimization. The correct option for this is -fpatchable-function-entry
-fpatchable-function-entry=N[,M]
Generate N NOPs right at the beginning of each function, with the function entry point before the Mth NOP
. If M is omitted, it defaults to 0 so the function entry points to the address just at the first NOP
. The NOP
instructions reserve extra space which can be used to patch in any desired instrumentation at run time, provided that the code segment is writable. The amount of space is controllable indirectly via the number of NOPs; the NOP instruction used corresponds to the instruction emitted by the internal GCC back-end interface gen_nop
. This behavior is target-specific and may also depend on the architecture variant and/or other compilation options.
它将插入 N 单字节 0x90 NOP 和 doesn't make use of multi-byte NOPs 因此性能不如预期,但您可能不关心在这种情况下,该选项应该可以正常工作
我正在尝试练习一些实时检测,我看到有一个链接器选项 -call-nop=prefix-nop
,但它有一些限制,因为它只适用于 GOT 函数(我不知道如何强制编译器生成 GOT 函数,不确定出于性能原因这是否是个好主意。)另外,-call-nop=*
不能填充超过 1 个字节。
理想情况下,我希望看到一个编译器选项来填充任何特定数量的字节,并且编译器仍将执行所有正常的函数对齐。
一旦我有了这个填充区域,我就可以在 运行 的时候重新使用这些填充区域来存储一些值或重定向控制流。
P.S。我相信 Linux 内核使用类似的技巧来动态启用某些软件跟踪点。
我通过在汇编文件中实现自己的 mcount
函数并使用 -pg
编译代码来实现这个目标。
-pg
适用于 profile-guided optimization. The correct option for this is -fpatchable-function-entry
-fpatchable-function-entry=N[,M]
Generate N NOPs right at the beginning of each function, with the function entry point before the Mth
NOP
. If M is omitted, it defaults to 0 so the function entry points to the address just at the firstNOP
. TheNOP
instructions reserve extra space which can be used to patch in any desired instrumentation at run time, provided that the code segment is writable. The amount of space is controllable indirectly via the number of NOPs; the NOP instruction used corresponds to the instruction emitted by the internal GCC back-end interfacegen_nop
. This behavior is target-specific and may also depend on the architecture variant and/or other compilation options.
它将插入 N 单字节 0x90 NOP 和 doesn't make use of multi-byte NOPs 因此性能不如预期,但您可能不关心在这种情况下,该选项应该可以正常工作