Clang Libtool 的行为因生成的二进制文件的位置而异
Clang Libtool behavior different based on the location of the generated binary
我创建了一个非常简单的基于 Clang Libtool 的程序,它构建了一个 AST 并将 AST 转储到控制台。
我是 compiling/linking 我的程序,它存在于 LLVM/Clang 源代码树之外,使用以下命令针对来自 http://releases.llvm.org/download.html 的预构建二进制文件之一 -
c++ -DCLANG_ENABLE_ARCMT -DCLANG_ENABLE_OBJC_REWRITER -DCLANG_ENABLE_STATIC_ANALYZER -DGTEST_HAS_RTTI=0 -DLLVM_BUILD_GLOBAL_ISEL -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/include -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -Werror=date-time -std=c++11 -fno-common -Woverloaded-virtual -fno-strict-aliasing -g -fno-exceptions -fno-rtti -o main.cpp.o -c Main.cpp
然后使用以下命令进行链接 -
c++ -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -Werror=date-time -std=c++11 -fno-common -Woverloaded-virtual -fno-strict-aliasing -g -Wl,-allow-shlib-undefined -Wl,-rpath-link,/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib main.cpp.o -o myprogram -Wl,-rpath,/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib -L/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib -lpthread -lclangTooling -lclangBasic -lclangASTMatchers -lclangFormat -lclangFrontend -lclangDriver -lclangParse -lLLVMMCParser -lclangSerialization -lclangSema -lclangEdit -lclangAnalysis -lLLVMBitReader -lLLVMProfileData -lclangToolingCore -lclangAST -lclangRewrite -lclangLex -lclangBasic -lLLVMCore -lLLVMMC -lLLVMOption -lLLVMSupport -lrt -ldl -ltinfo -lpthread -lz -lm
我发现上述 2 个步骤没有错误或问题。
如果我将此 myprogram 二进制文件复制到 /llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/bin 目录和 运行它正确生成了 AST 并且 运行s 如预期的那样。
但是,如果我从任何其他位置 运行 这个二进制文件,我看不到任何警告或错误,但不会生成 AST。该程序转储了在预处理阶段后生成的不完整 AST。
我尝试在链接时使用 -static
标志,并将 ${LD_LIBRARY_PATH}
值设置为 /llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib
文件夹,但这没有任何区别。
因为程序 运行 在移动到 llvm/bin 文件夹时可以正常运行,但当它存在于其他任何地方时 运行 不能正常运行。看起来程序加载了一些与 /bin 目录相关的库,但我无法弄清楚需要设置什么以确保程序 运行s 正确移动到其他任何地方。
任何人都可以就如何进行提供任何建议。谢谢。
这里的问题是,在 compiling/linking Clang Libtool 程序之后,当我们执行程序时,我们需要提供 -isystem 标志给指向llvm 版本的 lib 文件夹以下列方式 -
$ ./myprogram -isystem/{CLANG_PATH}/lib "other args"
对于 llvm-5.0,我注意到在链接时使用 -static 关键字会导致关于 glib 版本的警告类似于此 Whosebug post.
我能够通过在我的 Makefile 中正确设置 -rpath 标志来解决这个问题 -
"-Wl,-rpath,$(CLANG_PATH)/lib"
我创建了一个非常简单的基于 Clang Libtool 的程序,它构建了一个 AST 并将 AST 转储到控制台。
我是 compiling/linking 我的程序,它存在于 LLVM/Clang 源代码树之外,使用以下命令针对来自 http://releases.llvm.org/download.html 的预构建二进制文件之一 -
c++ -DCLANG_ENABLE_ARCMT -DCLANG_ENABLE_OBJC_REWRITER -DCLANG_ENABLE_STATIC_ANALYZER -DGTEST_HAS_RTTI=0 -DLLVM_BUILD_GLOBAL_ISEL -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/include -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -Werror=date-time -std=c++11 -fno-common -Woverloaded-virtual -fno-strict-aliasing -g -fno-exceptions -fno-rtti -o main.cpp.o -c Main.cpp
然后使用以下命令进行链接 -
c++ -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -Werror=date-time -std=c++11 -fno-common -Woverloaded-virtual -fno-strict-aliasing -g -Wl,-allow-shlib-undefined -Wl,-rpath-link,/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib main.cpp.o -o myprogram -Wl,-rpath,/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib -L/llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib -lpthread -lclangTooling -lclangBasic -lclangASTMatchers -lclangFormat -lclangFrontend -lclangDriver -lclangParse -lLLVMMCParser -lclangSerialization -lclangSema -lclangEdit -lclangAnalysis -lLLVMBitReader -lLLVMProfileData -lclangToolingCore -lclangAST -lclangRewrite -lclangLex -lclangBasic -lLLVMCore -lLLVMMC -lLLVMOption -lLLVMSupport -lrt -ldl -ltinfo -lpthread -lz -lm
我发现上述 2 个步骤没有错误或问题。
如果我将此 myprogram 二进制文件复制到 /llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/bin 目录和 运行它正确生成了 AST 并且 运行s 如预期的那样。
但是,如果我从任何其他位置 运行 这个二进制文件,我看不到任何警告或错误,但不会生成 AST。该程序转储了在预处理阶段后生成的不完整 AST。
我尝试在链接时使用 -static
标志,并将 ${LD_LIBRARY_PATH}
值设置为 /llvm-3.9.1/clang+llvm-3.9.1-x86_64-linux-gnu-debian8/lib
文件夹,但这没有任何区别。
因为程序 运行 在移动到 llvm/bin 文件夹时可以正常运行,但当它存在于其他任何地方时 运行 不能正常运行。看起来程序加载了一些与 /bin 目录相关的库,但我无法弄清楚需要设置什么以确保程序 运行s 正确移动到其他任何地方。
任何人都可以就如何进行提供任何建议。谢谢。
这里的问题是,在 compiling/linking Clang Libtool 程序之后,当我们执行程序时,我们需要提供 -isystem 标志给指向llvm 版本的 lib 文件夹以下列方式 -
$ ./myprogram -isystem/{CLANG_PATH}/lib "other args"
对于 llvm-5.0,我注意到在链接时使用 -static 关键字会导致关于 glib 版本的警告类似于此 Whosebug post.
我能够通过在我的 Makefile 中正确设置 -rpath 标志来解决这个问题 -
"-Wl,-rpath,$(CLANG_PATH)/lib"