有没有办法在 MATLAB 中安全地修改 mex 文件?
Is there a way to safely modify mex files in MATLAB?
我正在使用别人的代码来达到我的目的。此代码使用从 C
代码生成的 .mex64
文件。此文件中有一个打印语句 - 它在命令 window 上显示一些内容。我需要修改此声明的文本。我可以重新编译,但我没有完整的源代码。
当我在文本编辑器中打开 mex64
文件时,我可以看到要打印的纯文本文本。但是,如果我尝试修改它并 运行 它,matlab 会因系统错误而崩溃 -
Abnormal termination:
Access violation
以下是我尝试重现问题的方法。我写了下面的代码-
#include <stdio.h>
#include "C:\Program Files\MATLAB\R2017b\extern\include\mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
main();
return;
}
int main(){
printf("Hello\n");
}
mex64
文件正常生成 运行s - 打印文本 "Hello"。但是当我在 mex64
文件中找到单词 "Hello" 并将其修改为 "Hell" 时,它如上所述崩溃了。看起来 MATLAB 中的某种完整性检查失败了。
有人可以解释发生了什么吗?
有没有办法以某种方式修改 mex64
文件并成功 运行 它?
如果更改文本长度,其他内容会在文件中四处移动,导致内部指针错误。
但这可能不是唯一发生的事情。您的文本编辑器也可能会更改许多其他字节的值(例如,0-31 范围内的值在文本中没有意义,文本编辑器通常会忽略或更改它们)。
您应该在二进制文件编辑器中执行此操作,这些通常被称为 hex editor。
在编译代码中更改字符串中字节的值是完全可以的。但是只改变它们的值,不要删除或添加任何字节。
您会注意到所有字符串都以 0 字节结尾。那是字符串结束标记。不要覆盖它。但是您可以(通常)提前添加一个以使字符串更短。也就是说,您在字符串末尾添加一个零字节,并且不要删除后面的任何字节。
我正在使用别人的代码来达到我的目的。此代码使用从 C
代码生成的 .mex64
文件。此文件中有一个打印语句 - 它在命令 window 上显示一些内容。我需要修改此声明的文本。我可以重新编译,但我没有完整的源代码。
当我在文本编辑器中打开 mex64
文件时,我可以看到要打印的纯文本文本。但是,如果我尝试修改它并 运行 它,matlab 会因系统错误而崩溃 -
Abnormal termination: Access violation
以下是我尝试重现问题的方法。我写了下面的代码-
#include <stdio.h>
#include "C:\Program Files\MATLAB\R2017b\extern\include\mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
main();
return;
}
int main(){
printf("Hello\n");
}
mex64
文件正常生成 运行s - 打印文本 "Hello"。但是当我在 mex64
文件中找到单词 "Hello" 并将其修改为 "Hell" 时,它如上所述崩溃了。看起来 MATLAB 中的某种完整性检查失败了。
有人可以解释发生了什么吗?
有没有办法以某种方式修改 mex64
文件并成功 运行 它?
如果更改文本长度,其他内容会在文件中四处移动,导致内部指针错误。
但这可能不是唯一发生的事情。您的文本编辑器也可能会更改许多其他字节的值(例如,0-31 范围内的值在文本中没有意义,文本编辑器通常会忽略或更改它们)。
您应该在二进制文件编辑器中执行此操作,这些通常被称为 hex editor。
在编译代码中更改字符串中字节的值是完全可以的。但是只改变它们的值,不要删除或添加任何字节。
您会注意到所有字符串都以 0 字节结尾。那是字符串结束标记。不要覆盖它。但是您可以(通常)提前添加一个以使字符串更短。也就是说,您在字符串末尾添加一个零字节,并且不要删除后面的任何字节。