У меня есть MEX-файл, скомпилированный нормально с g ++.
Недавно я изменил его компиляцию для использования clang ++ и включил -fsanitize=address
в LDFLAGS
и CFLAGS
(примечание: для этого проекта не существует флагов CXX).
Однако, несмотря на это, как только я попадаю в MATLAB и пытаюсь вызвать MEX-файл, я получаю:
Invalid MEX-file '(path to mex file)': undefined symbol: __asan_option_detect_stack_use_after_return.
Эта конкретная ошибка действительно распространена, когда люди неправильно связываются со средством очистки адресов. Тем не менее, в буквально каждый файл, который я компилирую , на который он связан. Каждый .o, каждый .mexa64.
Я подозреваю, что это потому, что сама MATLAB на это не способна, но я не уверен. Некоторое руководство от других разработчиков MEX было бы фантастическим.
Полные шаги, которые я использовал для тех, кому это нужно:
1: установить libasan (для меня это было "yum install libasan", но оно может отличаться)
2: Добавьте -fsanitize=address
к файлам LDFLAG и CFLAG make-файла, создавая файлы MEX и объектные файлы для моего проекта.
3: Make clean и make, чтобы убедиться, что в него включена библиотека (я собрал с g ++, по-видимому, clang по умолчанию использует STATIC-версию libasan, которая не будет работать в ситуациях, подобных этой, когда исполняемый исполняемый файл фактически не скомпилирован с либасаном)
4: в терминале выполните:
export LD_PRELOAD=/lib64/libasan.so.5
(хотя это местоположение может быть разным. Я узнал, как найти его, используя этот пост: Получить местоположение libasan из gcc / clang )
Затем выполните:
export ASAN_OPTIONS=halt_on_error=false
5: Наконец, позвоните в MATLAB:
matlab -nojvm -nodesktop -nosplash
6: Затем (и это может быть характерно для моего проекта) я записал CD в каталог, где находился проект MATLAB, сделал addpath(genpath('.'))
, чтобы добавить все его файлы, и, наконец, вызвал реальный скрипт MATLAB, который выполняет эту работу. .
Результатом были ошибки зеленого и красного цвета, например:
Адрес 0x (некоторый адрес) находится в стеке потока T (номер потока)
РЕЗЮМЕ: AddressSanitizer: memcpy-param-overlap (libasan.so.5 + (некоторое число))
или же
ОШИБКА: AddressSanitizer: memcpy-param-overlap: диапазоны памяти [range] и [range] перекрываются