如何强制clang对memmove()执行内联或无需PLT的静态调用
Clang AArch64 环境下静态调用/内联memmove的解决方案
- 跳过PLT调用方案:添加编译参数
-fno-plt,该参数会让所有动态库函数调用直接通过GOT寻址,跳过PLT跳转流程,在不改变动态链接逻辑的前提下消除PLT的额外开销,满足不需要经过PLT的需求。 - 部分静态链接方案:链接时添加参数
-Wl,-Bstatic -lc -Wl,-Bdynamic,该参数会指定静态链接libc库的内容,memmove会直接从静态libc中链接到二进制文件中,其余依赖库依然保持动态链接,不需要手动引入架构相关的汇编实现。 - 强制优先使用内置实现方案:添加编译参数
-fforce-builtin-functions=memmove,强制Clang优先调用内置的memmove实现,编译期长度固定的memmove调用会直接展开为内联指令,长度动态的场景也会优先选择架构通用的短内联实现,尽可能避免函数调用开销。 - 全静态编译方案:添加编译参数
-static,整个程序所有依赖都会静态链接,memmove完全不会走动态调用流程,符合需求,唯一缺点是最终生成的二进制文件体积会有所增加。
以上参数均兼容你使用的Clang 12 AArch64版本,保留-O3优化参数配合以上开关使用,Clang会尽可能对memmove做内联优化,效果更优,你可以编译完成后通过反汇编验证memmove的调用逻辑是否符合预期。
内容的提问来源于stack exchange,提问作者swineone
相关产品推荐
相关产品推荐

