web-dev-qa-db-ja.com

`__stack_chk_fail 'への未定義の参照

C++コードのコンパイル中にこのエラーを取得:

undefined reference to `__stack_chk_fail'

すでに試したオプション:

  1. コンパイル中に-fno-stack-protectorを追加-機能せず、エラーが続く
  2. コードにvoid __stack_chk_fail(void)のダミー実装を追加しました。それでも同じエラーが発生する。

詳細なエラー:

/u/ac/alanger/gurobi/gurobi400/linux64/lib/libgurobi_c++.a(Env.o)(.text+0x1034): In function `GRBEnv::getPar/u/ac/alanger/gurobi/gurobi400/linux64/lib/libgurobi_c++.a(Env.o)(.text+0x1034): In function `GRBEnv::getParamInfo(GRB_StringParam, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)':
: undefined reference to `__stack_chk_fail'
amInfo(GRB_StringParam, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)':
: **undefined reference to `__stack_chk_fail'**

以前は、そのようなエラーが数十件発生していました。私が使用しているプリコンパイル済みライブラリのgccと、コードのコンパイルに使用していたgccバージョンの間にバージョンの不一致があることがわかりました。 gccを更新しました。これらのエラーは2つしか発生しません。

何か助けてください?

29
Akhil

libgurobi_c ++。aは-fno-stack-protectorでコンパイルされました(明らかに)。

いくつかのことが頭に浮かびます:

  1. リンク時に-fno-stack-protectorを追加します。これにより、libsspが確実にリンクされます。
  2. 手動でリンク-lssp
  3. 独自のオブジェクトファイルに__stack_chk_fail(void)のダミーバージョンを作成し、この.oファイルをリンカーコマンドに追加します[〜#〜] after [〜#〜] libgurobi_c ++。a。 GCC/G ++はリンク中にシンボルを左から右に解決するため、コードに関数が定義されていても、__ stack_chk_failシンボルを含むオブジェクトのコピーをlibgurobi_c ++。aの右側のリンカー行に置く必要があります。
32
gravitron

Gentooでは同じ問題があり、2つのファイルの作成を解決しました。 1つ目は、emergeによって解析されてgccに渡されるオプションを含みます。

/etc/portage/env/nostackprotector.conf
CFLAGS="-fno-stack-protector -O2"

2番目は、どのパッケージがこの設定を使用する必要があるかを示しています。

/etc/portage/package.env/nostackprotector
x11-libs/vte nostackprotector.conf
sys-libs/glibc nostackprotector.conf
www-client/chromium nostackprotector.conf
app-admin/Sudo nostackprotector.conf
0
Alex

https://wiki.ubuntu.com/ToolChain/CompilerFlags

言う:

「これは通常、ビルド中にリンクを実行するためにgccではなくldを呼び出した結果です」

これは、libjpegのMakefileを手動で変更したときに遭遇したものです。 ldの代わりにgccを使用して問題を解決しました。

0
bjc