Как я могу сделать ld экспортировать заглавные буквы? - PullRequest
0 голосов
/ 04 апреля 2019

Я работаю над тем, чтобы gfortran работал вместо компилятора Intel Fortran для MATLAB в Windows 10. Стиль искажения имен в GCC, по крайней мере для gfortran, состоит в том, чтобы сделать имя символа строчными и добавить символ подчеркивания;«mxIsNumeric800» становится mxisnumeric800_.Чтобы MATLAB распознавал символы, они должны опустить добавленное подчеркивание (просто, просто добавьте -fno-underscoring к опциям компилятора) и состоять полностью из буквенно-цифровых символов в верхнем регистре (сложно, но возможно).

I 'мы смогли решить эту проблему с использованием заглавных букв, используя метод, описанный в в этом ответе , но я не могу получить экспортированные символы в верхнем регистре.Вот экспортированные символы для mex-файла, скомпилированного с помощью gfortran (часть вывода dumpbin /exports timestwo.mexw64):

ordinal hint RVA      name

      1    0 00001510 mexfilerequiredapiversion
      2    1 000013E0 mexfunction
      3    2 000013C0 timestwo

и того же файла, скомпилированного с помощью компилятора Intel Fortran:

ordinal hint RVA      name

      1    0 00001150 MEXFILEREQUIREDAPIVERSION
      2    1 00001000 MEXFUNCTION

Компилятор Intel обрабатывает экспорт через опцию компоновщика /EXPORT:FOO, которая используется дважды, один раз для MEXFUNCTION и один раз для MEXFILEREQUIREDAPIVERSION.Я попытался использовать файл .def, состоящий из

EXPORTS
MEXFUNCTION
MEXFILEREQUIREDAPIVERSION

, но его связывание (в отличие от файла .def с символами в нижнем или нижнем регистре) ничего не меняет.Я также попытался добавить в свой скрипт компоновщика:

EXTERN(MEXFUNCTION,MEXFILEREQUIREDAPIVERSION);
PROVIDE(mexfunction = MEXFUNCTION);
PROVIDE(mexfilerequiredapiversion = MEXFILEREQUIREDAPIVERSION);

, но это ничего не меняет.

Как я могу изменить эти символы в верхний регистр?

1 Ответ

0 голосов
/ 05 апреля 2019

Я решил конкретную проблему, с которой столкнулся, но решение не является удовлетворительным (скомпилированные gfortran mex-файлы по-прежнему вызывают сбой MATLAB).

Как выяснилось, есть несколько способов сделать прописную букву вручную. Один, который, как я думал, не сработал, но с тех пор обнаружил иное, это BIND(C,NAME=""). Функция mex, такая как subroutine mexfunction(nlhs, plhs, nrhs, prhs) bind(C,name="MEXFUNCTION"), приводит к появлению символа MEXFUNCTION в верхнем регистре, который можно экспортировать.

Альтернативным способом является псевдоним символа в файле определения экспорта (.def). Файл, содержащий

EXPORTS
MEXFUNCTION = mexfunction
MEXFILEREQUIREDAPIVERSION = mexfilerequiredapiversion

, включенное при запуске компоновщика, также приведет к экспорту нужных символов. Любой из них является решением вопроса, даже если это не решение общей проблемы, которую я пытаюсь решить.

Использование любого из этих методов приводит к mex-функции, которая вызывает сбой MATLAB при запуске. Сбой происходит при запуске memcpy из VCRUNTIME140.dll в начале функции mex, что приводит к нарушению доступа. Мне удалось заставить MATLAB вывести аварийный дамп, создав функцию mex с символами отладки.

К сожалению, похоже, что gfortran работает с MATLAB еще больше, чем просто связывает правильные библиотеки и использует правильные символы.

...