【问题标题】:Building glib library with ASAN使用 ASAN 构建 glib 库
【发布时间】:2020-05-26 20:20:51
【问题描述】:

我正在使用 ASAN 构建 glib 库,gcc 版本是 6.3。

我能够使用 ASAN 编译和构建 glib 库。我的配置命令是:-

../configure  CC='/local/test/v6.3.0/bin/gcc' CXX='/local/test/v6.3.0/bin/g++' CFLAGS='-fPIC -O2 -fsanitize=address' CXXFLAGS='-fPIC -fsanitize=address' LDFLAGS='-L/local/test/v6.3.0/lib64 -lasan' LD_LIBRARY_PATH='/local/test/v6.3.0/lib64'  --enable-static=yes --prefix=/home/testing/debug_glib/glib-2.56.1/testing_glb --enable-libmount=no PYTHON=/local/test/pkgs/python/v2.7.6/bin/python --with-pcre=/home/testing/pcre_lib/pcre-8.20/pcre_library

当我尝试使用新创建的 glib 库时,我遇到了对符号问题的未定义引用:

$ /local/test/client_new/test_build/kkl/tools/kenzip -c dcltotb.tcl
/home/testing/lib/libglib-2.0.so: undefined symbol: __asan_option_detect_stack_use_after_return

我正在链接其中定义了上述符号的 ASAN 库 (-lasan)。这里有什么遗漏吗?请帮忙! 提前致谢。

【问题讨论】:

  • “我遇到了对符号问题的未定义引用”——当你链接你的可执行文件或运行它时你会点击它吗?
  • 当我尝试在我的应用程序中使用新的 glib(通过运行上面的配置命令使用 ASAN 构建)时。我正在解决这个问题。
  • 那么这个错误是在你链接或者运行你的程序时发生的吗?请提供触发错误的确切命令。
  • 这里是命令:/local/test/client_new/test_build/kkl/tools/kenzip -c dcltotb.tcl 错误:/local/test/client_new/lop/lib/libglib-2.0.so :未定义符号:__asan_option_detect_stack_use_after_return
  • kenzip 是在没有 asan 的情况下创建的可执行文件。

标签: linker glibc glib address-sanitizer


【解决方案1】:

构建最新版本的 GLib (2.62.4)。它是使用 Meson 而不是 autotools 构建的,您可以在配置构建时enable ASAN by passing -Db_sanitize=address to meson

【讨论】:

  • Phiip,我正在尝试创建 glib 版本 2.56,无法使用该版本构建 asan 版本的 glib?实际上,我们现在不想改变我们的 glib。
  • 如果 OP 尝试将已清理的 Glib 链接到未清理的可执行文件,我怀疑仅此一项会有所帮助。
  • GLib 2.56 不受支持,并且(与所有旧的、不受支持的软件一样)存在安全漏洞。您应该尽快切换到更新版本的 GLib。从 autotools 切换到 Meson 的副作用应该使许多常见的构建系统操作(如使用消毒剂)更快、更容易。但如果您必须使用 GLib 2.56,请参阅 yugr 的回答,了解如何使用 sanitisers 构建该版本。
【解决方案2】:

首先您需要将您的LDFLAGS 更正为

LDFLAGS=-fsanitize=address

然后,您需要在运行 unsanitized 时预加载 libasan 可执行文件

LD_PRELOAD=path/to/libasan.so /local/test/client_new/test_build/kkl/tools/kenzip -c dcltotb.tcl

【讨论】:

  • 嗨 Yugr,尝试纠正 LDFLAGS,然后将 LD_PRELOAD 设置为 asan.so 路径,当我尝试使用 'make' 创建 glib 时。一段时间后,它因“==98241==ERROR:LeakSanitizer:检测到内存泄漏”错误而失败。
  • @santosh 在运行make 时,我的回答中没有建议设置LD_PRELOAD。再一次:“在运行未经处理的可执行文件时,您需要预加载 libasan.so”。
  • 很抱歉我没能找到你。这里我只是用 asan 创建 glib 库。 glib 创建步骤:- 1) 配置.... 2) 制作 3) 制作安装。从某种意义上说是未经清理的可执行文件?
  • @santosh LD_PRELOAD 需要在运行kenzip之前设置。
  • @santosh 您可以尝试我在之前评论中发布的链接(建议使用-fsanitize-recover=addresshalt_on_error)。但是我们不要在 cmets 中讨论它,因为它与您的原始问题(“Building Glib library with Asan”)无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
相关资源
最近更新 更多