使用Mimick mock exit函数时出现stack not 16 byte aligned错误如何解决
问题原因与解决方案
根因
这个问题是Mimick库在x86_64架构macOS平台的实现bug,和你的操作、编译器版本无关。
macOS x86_64的System V ABI明确要求:任意函数调用执行前,栈指针%rsp必须16字节对齐。Mimick旧版本的动态跳转(trampoline)逻辑在处理函数hook时,没有对栈指针做对齐修正,尤其是处理exit这类带有noreturn属性的函数时,栈对齐校验会直接触发报错。
你之前尝试添加的-fno-stack-check -mmacosx-version-min=10.14参数无法解决问题,原因是这两个参数只能调整编译器生成的用户代码逻辑,无法修改Mimick库内部预实现的汇编跳转代码的栈操作逻辑。
解决方案
- 方案1:升级Mimick到最新master分支版本
官方已经在后续提交中修复了x86_64 Darwin平台的栈对齐问题,重新拉取最新代码编译后替换本地./lib、./include下的库文件即可。 - 方案2:临时添加编译参数规避
给你的编译命令加上-mstackrealign参数,强制编译器在函数入口生成栈对齐修正代码,大部分场景下可以绕过该问题,修改后的编译命令如下:clang -I ./include -g -rpath ./lib/ -Wl,-segalign,1000 -L ./lib/ -lmimick -mstackrealign -o test test.c - 方案3:更换适配更完善的mock库
可以换用cmocka、cmock等成熟mock框架,这类框架对macOS平台的ABI适配更全面,不会出现此类底层兼容性问题。
内容的提问来源于stack exchange,提问作者Camden Narzt
相关产品推荐
相关产品推荐

