github.com/tencent/goom@v1.0.1/internal/bytecode/memory/mwrite_arm64.go (about) 1 package memory 2 3 // WriteTo this function is super unsafe 4 // 因为M1芯片不支持MProtect同时拥有写Write和执行Exec两个权限, 因此只能设置读和写来绕过系统检查 5 // 但是当前函数所在内存区段也需要保证没有被修改权限, 否则设置非执行的权限之后,执行后续代码会抛异常 6 // 因此采用较为hack的方式, 在当前函数前后填充空函数(BeforeSpace、Space)来避免被修改到权限 7 // 注意: BeforeSpace、Space长度均需要大于pageSize, 且因go中同一个包的函数一般会连续编译到附近 8 func WriteTo(addr uintptr, data []byte) error { 9 memoryAccessLock.Lock() 10 defer memoryAccessLock.Unlock() 11 if err := writeTo(addr, data); err != nil { 12 return err 13 } 14 ClearICache(addr) 15 return nil 16 } 17 18 // WriteToNoFlush 写入 .text 区, 不刷新 icache 19 func WriteToNoFlush(addr uintptr, data []byte) error { 20 memoryAccessLock.Lock() 21 defer memoryAccessLock.Unlock() 22 return writeTo(addr, data) 23 } 24 25 // WriteToNoFlushNoLock 写入 .text 区, 不刷新 icache, 不加锁 26 func WriteToNoFlushNoLock(addr uintptr, data []byte) error { 27 return writeTo(addr, data) 28 }