4

私たちのプロジェクト (C++) はリンクする必要がboost regexあるため、コンパイルされた正しいものを見つけて、libboost_regex_1.45.0g++ にリンクするように指示するだけです。コンパイルは成功し、期待どおりに適切な実行可能ファイルが取得されます。問題は、実行可能ファイルを実行しようとするたびに、main()ルーチンに入る前にクラッシュすることです。

で生成されたcoreファイルを添付するとgdbbacktraceコマンドは の間にセグメンテーション違反があることを示します。__bultin_strlenこれは に解決されstrlen@@GLBC_2.2.5ます。

実行可能ファイルは複数の動的ライブラリにリンクさreadelf -sれているため、問題のあるシンボルを特定するために利用され、結果としてlibboost_regex. ただし、参照されているシンボルは、RHEL6 システム フォルダーに既に存在します/lib64/libc.so

問題は、ブースト正規表現を適切に機能させるにはどうすればよいかということです。

  • OS:RHEL6.2
  • GCC: 4.3.2 /libstdc++6.0.13
  • Boost ライブラリは、まったく同じツールセットによって構築されています -user-config.bjamカスタマイズされています

静的リンクは、さまざまな理由から適切な選択ではありません。

シンボル情報とldd情報はhttps://gist.github.com/skyscribe/5184622に添付されています

4

1 に答える 1

0

gdb バックトレースから、std::char_traits<char>::length引数を持つメソッド\"http:\\\\/\\\\/localhostr.com\\\\/files\\\\/.+?\"がセグメンテーション違反を引き起こしていることがわかります。g++ 4.3.2 では、strlen の長さの計算に干渉する可能性のある新しいスタック スマッシング保護機能が導入されました。

最近の g++ コンパイラでコードを再コンパイル/再リンクし、このエラーが解決するかどうかを確認してください。このサンプル コードでは、このようなエラーは再現されません。

user@workstation ~
$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/4.5.3/lto-wrapper.exe
Target: i686-pc-cygwin
Configured with: /gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/configure --srcdir=/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --datarootdir=/usr/share --docdir=/usr/share/doc/gcc4 -C --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap --enable-version-specific-runtime-libs --libexecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions --enable-languages=ada,c,c++,fortran,java,lto,objc,obj-c++ --enable-graphite --enable-lto --enable-java-awt=gtk --disable-symvers --enable-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada --enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TARGET=gnatmake GNATBIND_FOR_TARGET=gnatbind --with-ecj-jar=/usr/share/java/ecj.jar
Thread model: posix
gcc version 4.5.3 (GCC)

user@workstation ~
$ cat test.cc
#include <iostream>
#include <string>

int main(int argc, char *argv[]) {
  char * a = "\"http:\\\\/\\\\/localhostr.com\\\\/files\\\\/.+?\"";
  int t =  std::char_traits<char>::length (a);
  std::cout << t << std::endl;
}

user@workstation ~
$ g++ -g test.cc
test.cc: In function ‘int main(int, char**)’:
test.cc:6:14: warning: deprecated conversion from string constant to ‘char*’

user@workstation ~
$ gdb a.exe
Reading symbols from /home/user/a.exe...done.
(gdb) b std::char_traits<char>::length
Breakpoint 1 at 0x4017f6: file /usr/lib/gcc/i686-pc-cygwin/4.5.3/include/c++/bits/char_traits.h, line 263.
(gdb) r
Starting program: /home/user/a.exe
[New Thread 764.0x5e4]
[New Thread 764.0x100c]

Breakpoint 1, std::char_traits<char>::length (__s=0x402080 "\"http:\\\\/\\\\/localhostr.com\\\\/files\\\\/.+?\"") at /usr/lib/gcc/i686-pc-cygwin/4.5.3/include/c++/bits/char_traits.h:263
263           { return __builtin_strlen(__s); }
(gdb) c
Continuing.
41
[Inferior 1 (process 764) exited normally]
(gdb)
于 2013-03-25T02:11:12.303 に答える