早上好。
我有一个自修改代码的程序。
真的,它构建二进制文件,然后由ELFPatch
更改并更改某些函数的序言。
我正在使用 Windriver WorkBench 3.3& VxWorks 6.9 Update3 。
我创建了一个标准模拟器(PENTIUM), 当我在模拟器上运行我的代码时:
void replace_prolog(void* func_ptr) {
char* p = (char*)func_ptr;
for (int i=0; i < PROLOGUE_SIZE; ++i)
p[i]=m_prologue[i]; // << prologue is a member array.
...
}
让我们称之为真正的序幕:原始序幕;
改变的序幕:改变了序幕;
在运行时放置的那个:替换序幕;
我得到一个异常(信号11 - 分段错误)
!我意识到这是VxWorks的.text
段保护。
所以,我创建了一个SimPC based VIP
作为我的模拟器BSP,并且排除了INCLUDE_PROTECT_TEXT
(以及它所有相关的内核组件)
并运行模拟器:
现在,也不例外!
.text
段的经验吗?我假设它是关于缓存的,暗示vxWorks知道这个区域不应该改变,所以它不会写入,但不知道我怎么检查它...
编辑2 :尝试将我的指针设为volatile
=&gt;同样的行为!
请帮助。
答案 0 :(得分:0)
这可能不是答案,但由于您看到预期的输出,它确认.text部分已更改。我能想到的唯一解释是,如果您使用主机工具查看.text内存,则可能会从主机读取信息。
您是否在目标上键入命令以查看内存位置?
答案 1 :(得分:0)
忘了问题:但仍然有答案。
Host_Tools
存在问题,但未显示.text
部分的更改。
在目标上,字节实际发生了变化。
该功能不起作用,因为我的转换破坏了动态链接。
"Whatever"
dl()
将已更改的重新连接指针转换回预期的重新定位。dl()
从改变后的重定位指针推断出预期的改变绝对指针,因此转换将创建绝对指针。注意:我选择#2因为它是最简单的,因为在我的系统中,无论如何我都不需要共享对象。