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  }