Apple silicon (Apple M2) における g++ のリンカーエラー

Macbook Air Apple M2 を購入し、競プロの環境構築中に遭遇したエラー。

すでに Homebrew で gcc をインストールしており、g++ で clang ではなく gcc が呼び出されているようになっている。(Homebrew GCC 13.2.0)

再現コード

#include <vector>

int main() {
    std::vector<int> a;
    return 0;
}

std::vector を使おうとするとエラーが出る。

エラー出力

% g++ main.cpp            
ld: warning: ignoring duplicate libraries: '-lgcc'
0  0x104f77648  __assert_rtn + 72
1  0x104eabfac  ld::AtomPlacement::findAtom(unsigned char, unsigned long long, ld::AtomPlacement::AtomLoc const*&, long long&) const + 1204
2  0x104ec1924  ld::InputFiles::SliceParser::parseObjectFile(mach_o::Header const*) const + 15164
3  0x104ecee30  ld::InputFiles::parseAllFiles(void (ld::AtomFile const*) block_pointer)::$_7::operator()(unsigned long, ld::FileInfo const&) const + 420
4  0x184138440  _dispatch_client_callout2 + 20
5  0x18414bf1c  _dispatch_apply_invoke + 224
6  0x184138400  _dispatch_client_callout + 20
7  0x184149fb8  _dispatch_root_queue_drain + 684
8  0x18414a6c0  _dispatch_worker_thread2 + 164
9  0x1842e4038  _pthread_wqthread + 228
ld: Assertion failed: (resultIndex < sectData.atoms.size()), function findAtom, file Relocations.cpp, line 1336.
collect2: error: ld returned 1 exit status

原因

ld: Assertion failed: (resultIndex < sectData.atoms.size()) にもあるように、リンカーのバグで、Xcode 15 以上で発生するらしい。 スレッドの開始日がこの記事を書いた 1 週間前くらいで、かなり最近発生したバグっぽい。

解決策

GitHub の issue にあった解決策を試した。

コンパイルオプションを使う

結局のところ Xcode 14 以前なら大丈夫っぽいので、-ld_classic をつけてコンパイルすれば良い。

reinstall する

brew reinstall -sv gcc すればオプション無しでも大丈夫らしい(が、時間がかかるようなので実行していない)。

追記(2024/05/15)

コンパイルオプションの -fsanitize=undefined,address が使えないので現在は諦めて clang を使っている。

実は #include <bits/stdc++.h> ができないこと以外はほぼ気にならない。