fragment writes all 6 flags prior to reading any
bb ilist before mangling:
TAG 0x00000000000100c4
<raw 0x00000000000100c4-0x00000000000100c8>::
+0 L3 @0x0000003dd284dc98 ff010113 addi %sp -16 -> %sp
---- multi-instr boundary ----
<raw 0x00000000000100c8-0x00000000000100cc>::
+4 L3 @0x0000003dd284dd68 00113423 sd %ra -> +0x08(%sp)[8byte]
---- multi-instr boundary ----
<raw 0x00000000000100cc-0x00000000000100d0>::
+8 L3 @0x0000003dd284ddd8 02b00513 addi %zero 43 -> %a0
---- multi-instr boundary ----
<raw 0x00000000000100d0-0x00000000000100d4>::
<translation 0x00000000000100d0>::
+12 L3 @0x0000003dd284de90 fe1ff0ef jal $0x00000000000100b0 -> %ra
---- multi-instr boundary ----
END 0x00000000000100c4
bb ilist after mangling:
TAG 0x00000000000100c4
<raw 0x00000000000100c4-0x00000000000100c8>::
+0 L3 @0x0000003dd284dc98 ff010113 addi %sp -16 -> %sp
---- multi-instr boundary ----
<raw 0x00000000000100c8-0x00000000000100cc>::
+4 L3 @0x0000003dd284dd68 00113423 sd %ra -> +0x08(%sp)[8byte]
---- multi-instr boundary ----
<raw 0x00000000000100cc-0x00000000000100d0>::
+8 L3 @0x0000003dd284ddd8 02b00513 addi %zero 43 -> %a0
---- multi-instr boundary ----
+12 m4 @0x0000003dd284df00 000100b7 lui 0x10 -> %ra
---- multi-instr boundary ----
+16 m4 @0x0000003dd284df70 0d40809b addiw %ra 212 -> %ra
---- multi-instr boundary ----
END 0x00000000000100c4
Before mangle 的 bb 似乎不太对,after mangle 之后,jal 直接被删掉了,所以 before 应该复制一份 position dependent 的,然后标记为 meta instruction,但我好像没在 Aarch64 port 上看到这个行为 🤔️
断点打在 jit code 上,第三个 bb segfaulted,问题出在
emit_indirect_branch_lookup ,明天继续!!终于开始着手实现 ibl 相关的东西了,进展比预计的要顺利很多,DR 设计得真是不错。终于下定决心找找为什么 DynamoRIO RV64 port 会重复编译。预期要花很久,但实际很快就解决了:https://github.com/DynamoRIO/dynamorio/pull/6252
发现 CMake 还挺直观的,虽然从来没学过,但还是可以根据直觉来修 bug。
发现 CMake 还挺直观的,虽然从来没学过,但还是可以根据直觉来修 bug。
从 Revy 那里用将近半价的价格收了一台 Matebook E Go (Windows on ARM),用了四天了,这设备真的是一堆破问题。
本身就不太喜欢 Windows,再加上 ARM 原生的应用不多(尤其是华为自带的软件竟然全都是 x86_64 的,简直不可原谅),Windows x86 Emulation 转译的效率又极其低下,体验真是一言难尽(微软你看看隔壁罗塞塔 2!)。
所以我把能卸载 x86 的应用全都卸载了,好在我日常用的软件都是有 ARM 原生的,最可惜的就是失去了华为生态的所有功能(比如笔和键盘的电量显示)。
但我还是很喜欢这个设备,硬件素质很好,生产力/娱乐性都可以吊打 iPad,还有 WSL/WSA,多核性能直逼 M1 的 80%,只要 3000 块,还要什么自行车。
本身就不太喜欢 Windows,再加上 ARM 原生的应用不多(尤其是华为自带的软件竟然全都是 x86_64 的,简直不可原谅),Windows x86 Emulation 转译的效率又极其低下,体验真是一言难尽(微软你看看隔壁罗塞塔 2!)。
所以我把能卸载 x86 的应用全都卸载了,好在我日常用的软件都是有 ARM 原生的,最可惜的就是失去了华为生态的所有功能(比如笔和键盘的电量显示)。
但我还是很喜欢这个设备,硬件素质很好,生产力/娱乐性都可以吊打 iPad,还有 WSL/WSA,多核性能直逼 M1 的 80%,只要 3000 块,还要什么自行车。
#DynamoRIO
emit fragment 分为两个阶段:1)求大小;2)emit 代码
fragment prefix 大小固定为 8,两个阶段一致;exit stub size 固定为 64,两个阶段一致;所以问题应该出在 bb 本身的代码上。
大小差了 2,猜测大概率是 compressed 指令导致的?
emit fragment 分为两个阶段:1)求大小;2)emit 代码
fragment prefix 大小固定为 8,两个阶段一致;exit stub size 固定为 64,两个阶段一致;所以问题应该出在 bb 本身的代码上。
大小差了 2,猜测大概率是 compressed 指令导致的?
第一阶段算出来的 offset 是 122,检查过了,这个数字是对的,所以问题应该出在第二阶段的
set_linkstub_fields 函数里,step 进去看一下。我怎么会在 encode 里面写死 pc + 4 啊,头疼。因为 bb 里的正常指令都有 raw bits,所以走的 fast pass,只有最后面的一条 cti 因为被 mangle 过了 rawbits 被取消了,才走到 pc + 4。