MEX 文件可以是 运行 和 -fsanitize=address 吗?
Can MEX files be run with -fsanitize=address?
我有一个用 g++ 正常编译的 MEX 文件。
我最近将其编译更改为使用 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
添加到为我的项目构建 MEX 文件和目标文件的 makefile 的 LDFLAG 和 CFLAG。
3: Make clean 和 make 以确保它包含库(我用 g++ 构建,显然 clang 默认为 libasan 的 STATIC 版本,这在 运行 这样的情况下不起作用可执行文件实际上不是用 libasan 编译的)
4:在终端中,执行:
export LD_PRELOAD=/lib64/libasan.so.5
(虽然这个位置有所不同。我找到了如何使用这个 post 找到它:Get location of libasan from 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+(some number))
要么
错误:AddressSanitizer:memcpy-param-overlap:内存范围 [range] 和 [range] 重叠
经过清理的库(MEX-files 是共享库)期望 libasan.so
链接到主可执行文件(在这种情况下为 MATLAB)或在开始时 LD_PRELOAD
ed。由于您无法重建 MATLAB,因此第二种方法是您唯一的机会。
它可能无法顺利运行,因为 Asan 可能会在 MATLAB 启动代码中发现内存问题并在它到达您的 MEX-file 之前中止。您可以使用 export ASAN_OPTIONS=halt_on_error=false
忽略这些错误(它们仍然会被报告,但至少会继续执行)。
附带说明一下,您的问题类似于其他关于 运行 未经净化的解释器中经过净化的二进制插件的问题(参见 ,尽管那个是 Clang-centric)。
我有一个用 g++ 正常编译的 MEX 文件。
我最近将其编译更改为使用 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
添加到为我的项目构建 MEX 文件和目标文件的 makefile 的 LDFLAG 和 CFLAG。
3: Make clean 和 make 以确保它包含库(我用 g++ 构建,显然 clang 默认为 libasan 的 STATIC 版本,这在 运行 这样的情况下不起作用可执行文件实际上不是用 libasan 编译的)
4:在终端中,执行:
export LD_PRELOAD=/lib64/libasan.so.5
(虽然这个位置有所不同。我找到了如何使用这个 post 找到它:Get location of libasan from 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+(some number)) 要么 错误:AddressSanitizer:memcpy-param-overlap:内存范围 [range] 和 [range] 重叠
经过清理的库(MEX-files 是共享库)期望 libasan.so
链接到主可执行文件(在这种情况下为 MATLAB)或在开始时 LD_PRELOAD
ed。由于您无法重建 MATLAB,因此第二种方法是您唯一的机会。
它可能无法顺利运行,因为 Asan 可能会在 MATLAB 启动代码中发现内存问题并在它到达您的 MEX-file 之前中止。您可以使用 export ASAN_OPTIONS=halt_on_error=false
忽略这些错误(它们仍然会被报告,但至少会继续执行)。
附带说明一下,您的问题类似于其他关于 运行 未经净化的解释器中经过净化的二进制插件的问题(参见