C++ - Clang链接器问题和获取调试信息

42fyovps  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(212)

我想做C代码的调试信息分析。据我所知,Clang应该可以处理C
我试过clang myFile.cpp。但我得到

clang: error: unable to execute command: program not executable
clang error: linker command failed due to signal 1 (use -v to see invocation).

在设置了 * llvm-ld * 的路径之后,它部分工作。

clang C:myFile.cpp -S -emit-llvm -o -

它输出一些信息,但对于clang myFile.cpp仍然失败,错误为

clang version 2.9 (tags/RELEASE_29/final)
Target: i686-pc-win32
Thread model: posix
 "C:/FrontEnd/llvm/bin/Debug/clang.exe" -cc1 -triple i686-pc-win32 -emit-obj -mrelax-all -disable-free -main-file-name BinarySearch_Kernels.cpp -mrelocation-model static -mdisable-fp-elim -masm-verbose -mconstructor-aliases -momit-leaf-frame-pointer -v -resource-dir C:/FrontEnd/l
lvm/bin/Debug\..\lib\clang\2.9 -ferror-limit 19 -fmessage-length 280 -fcxx-exceptions -fexceptions -fms-extensions -fmsc-version=1300 -fgnu-runtime -fdiagnostics-show-option -fcolor-diagnostics -o C:/Users/ilipov/AppData/Local/Temp/cc-563130.o -x c++ C:\clang\BinarySearch_Kernels
.cpp
clang -cc1 version 2.9 based upon llvm 2.9 hosted on i686-pc-win32
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "/usr/include"
  #include "..." search starts here:
  #include <...> search starts here:
 C:/FrontEnd/llvm/bin/Debug/../lib/clang/2.9/include
 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include
 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\\include
End of search list.
 "link.exe" -out:a.out -defaultlib:libcmt -nologo C:/Users/ilipov/AppData/Local/Temp/cc-563130.o
clang: error: unable to execute command: program not executable
clang: error: linker command failed due to signal 1 (use -v to see invocation)

无论如何,我都希望获得尽可能完整的调试信息
例如,对于

class stamBase
{
public:
    int get1(){return 2;};
    int get0(){return 0;}
};
class stamDer : public stamBase
{
public:
    int get1(){return 1;}
};
void func()
{
    stamDer d;
    int x = d.get1();
}

我得到

target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
target triple = "i686-pc-win32"
%class.stamDer = type { i8 }
define void @_Z4funcv() {
entry:
  %d = alloca %class.stamDer, align 1
  %x = alloca i32, align 4
  %call = call i32 @_ZN7stamDer4get1Ev(%class.stamDer* %d)
  store i32 %call, i32* %x, align 4
  ret void
}
define linkonce_odr i32 @_ZN7stamDer4get1Ev(%class.stamDer* %this) nounwind align 2 {
entry:
  %this.addr = alloca %class.stamDer*, align 4
  store %class.stamDer* %this, %class.stamDer** %this.addr, align 4
  %this1 = load %class.stamDer** %this.addr
  ret i32 1
}

根据我对Clang调试信息代码的调查,我认为我也应该获得stamBase的信息!
如何正确运行Clang以接受完整的调试信息并防止Clang错误?

7bsow1i6

7bsow1i61#

我认为你需要安装一个链接器。GNU ld就可以了;你应该能够通过你的软件包管理器来安装它。
还有一个LLVM linker。它不太受欢迎,但一旦安装,它就会随Clang一起开箱即用(只需将其添加到PATH中,重新运行clang即可)。

相关问题