69532


コンパイル済みのc++のオブジェクトファイルをlldを使ってリンクしようとすると、次のようなエラーが出ます

[code]

    ld.lld: error: undefined symbol: _Unwind_Resume
    >>> referenced by main.cpp
    >>>               objs/main.o:(KernelMain)
    
[/code]

makefileは次のようになっています（make kernel.elfでコンパイル&リンク）

[code]

    CC = gcc
    CFLAGS =  -Wall -Wextra
    CFLAGS += -nostdlib
    OBJS = objs/main.o objs/entry.o objs/graphics.o objs/console.o
    
    objs/%.o: %.asm
        nasm -f elf64 -o $@ $<
    
    objs/%.o: %.c
        $(CC) $(CFLAGS) -I includes -c -o $@ $<
    
    objs/%.o: %.cpp
        clang++ -I includes -c $< -o $@
    
    kernel.elf: $(OBJS)
        ld.lld -L/lib/x86_64-linux-gnu/ -lstdc++ --entry KernelEntry -z norelro --image-base 0x100000 --static -o $@ $+
    
[/code]

ソフトウェアのバージョンは以下のような感じです

[code]

    gcc 9.3.0
    nasm 2.14.02
    clang++ 7.0.1-12
    lld 7.0.1
    
[/code]

調べてみたところgccのバージョンがコンパイル時とリンク時で違うことによって起こる問題（？）とのような情報を得られたのですが、c++のコンパイルにはclang++を使っており、リンカもlldを使っているのでどのように変更すればいいのかわかりません。

どのようにすればエラーなしに正常にリンク作業を行えるかご教授お願い致します。


CC BY-SA 4.0
2020-08-13T05:54:32.437
69511
2020-08-15T12:55:58.187
30148
question
c++ c makefile
lldを使ってリンクをしようとすると「undefined symbol: _Unwind_Resume」というエラーが出る


`_Unwind_Resume`というシンボルは例外処理関連のもので、専用のライブラリ（`libgcc_s`など）が実装しています。`-nostdlib`をつけるとそういったライブラリがリンクされなくなるので、シンボルが解決できずエラーが発生します。質問のMakefileでは`clang++`に`-nostdlib`が渡されていないので、そうはならないはずなのですが…。

Makefileの`ld.lld`を実行するところに追加で`-lgcc_s`を渡してみるとうまくいくかもしれません。

参考：[Exception Handling in LLVM](https://llvm.org/docs/ExceptionHandling.html),
[Ubuntu で clang + libc++
を使う](https://qiita.com/kojiohta/items/fb6c307365d1db388acc)


CC BY-SA 4.0
2020-08-13T23:11:52.430
69532
2020-08-15T12:55:58.187
2020-08-15T12:55:58.187
7500
7500
69511
answer


C++のプログラムを分割コンパイルする場合、最後のリンク処理でも、リンカではなくて、コンパイラドライバ("clang++"や"g++")を、ふつうは使うと思います。

[code]

    clang++ -c a.cpp
    clang++ -c b.cpp
    clang++ -o prog_ab a.o b.o
    
[/code]

3行目のclang++では、中でclang++は当然リンカを起動しますが、リンカには a.o と b.o
だけでなく、C++として動作するために必要なオブジェクトやライブラリをリンクしてくれているはずです。（25年くらい前はそうでした）

ただ、何か特殊なリンクの仕方をする必要がある場合は、リンカを直接たたくこともあるのでしょう。

リンカを直接たたいてリンクしたい場合には、普段はコンパイラドライバが気を効かせてくっつけてくれている、その他のライブラリを自分の責任でくっつける必要があるはずですが、その辺はぬかりなくやっていらっしゃいますか？C言語の場合、むかしは
"crt.o" というオブジェクトファイルがリンクされたりしてました。


CC BY-SA 4.0
2020-08-14T08:13:57.550
69547
2020-08-14T08:13:57.550
40200
69511
answer