Есть ли способ безопасно изменить mex файлы в MATLAB? - PullRequest
0 голосов
/ 06 июля 2018

Я использую чужой код для своих целей. Этот код использует файл .mex64, сгенерированный из кода C. В этом файле есть оператор печати - он что-то отображает в командном окне. Мне нужно изменить текст этого заявления. Я мог бы перекомпилировать, но у меня нет полного исходного кода.

Когда я открываю файл 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 работает нормально - печатает текст «Hello». Но когда я нашел слово «Hello» в файле mex64 и изменил его на «Hell», оно рухнуло, как описано выше. Похоже, что в MATLAB есть какая-то проверка целостности, которая не проходит.

Может кто-нибудь объяснить, что происходит?

Есть ли способ как-то изменить файл mex64 и успешно запустить его?

1 Ответ

0 голосов
/ 06 июля 2018

Если вы измените длину текста, другие вещи перемещаются в файле, делая внутренние указатели неправильными.

Но это, вероятно, не единственное, что происходит. Ваш текстовый редактор, вероятно, также изменяет значение многих других байтов (например, значения в диапазоне от 0 до 31 не имеют смысла в тексте, и часто текстовые редакторы игнорируют их или изменяют их).

Вы должны сделать это в редакторе двоичных файлов, их часто называют hex editor .

Прекрасно изменить значение байта в строке в скомпилированном коде. Но только меняйте их значения, не удаляйте и не добавляйте байты.

Вы заметите, что все строки заканчиваются байтом 0. Это маркер конца строки. Не перезаписывайте это. Но вы можете (обычно) добавить один раньше, чтобы сделать строку короче. То есть вы добавляете нулевой байт в конец вашей строки и не удаляете ни один из байтов, которые идут после.

...