BLOGTIMES
» ArchiveList (Tag for "icc" )
«Prev || 1 · | Next»
2008/12/30

_intel_fast_memsetや_intel_fast_memcpyのエラーが出るときは

icc  linux  c  intel 

プライベートなテスト環境にiccをインストールして使っているのですが、MySQLをiccを使ってリコンパイルしてみたら、libmysqlclientを使うプログラムがundefined symbol: _intel_fast_memsetというエラーを吐いて落ちるようになってしまいました。

どう考えてもicc周りのトラブルのようなのですが、解決方法がなかなか見つけられなくて困りましたが、下記のicc 8.0のリリースノートの情報で何とか解決することができました。

Linux 版インテル(R) C コンパイラ 8.0 リリースノート

高速メモリ Copy ルーチン

コマンドラインで -nostdlib を指定した場合やインテル C コンパイラのドライバからではなく、直接リンカを呼び出したことにより、標準のインテル・ライブラリに対してリンクが行われない場合の問題について次に説明します。

インテル C コンパイラは、_intel_fast_memcpy と _intel_fast_memset の 2 つのルーチンを使用して、ソースコードでは __builtin_memcpy と __builtin_memset にマクロ展開されていない memcpy 演算と memset 演算を行います。これらは、libirc にあります。gcc コンパイラを使用してアプリケーションをリンクしたり、リンカ ld を直接呼び出すと、これらの 2 つのルーチンが未解決のシンボルになります。このため、コンパイル・フェーズで使用したコンパイラ・オプションと同じものを使用して、インテル C コンパイラでリンクすることを推奨します。ただし、これらのルーチンを未定義の外部参照とみなす場合は、-lirc をリンク行に追加するか、または memcpy および memset が組込み形式にマクロ展開されるようにインクルードを変更して、再コンパイルします。IA-32 ベース・アプリケーション用インテル C コンパイラは、任意のプログラムのメインルーチンから intel_proc_init ルーチンを呼び出し、プロセッサが正しく設定されるようにします。また、このルーチンは libirc にも含まれています。これらのルーチンは glibc からのエントリポイントを使用するので、コマンドラインでは -lirc を -lc の前に配置する必要があります。

つまり、iccを使って作ったライブラリをiccを使わずにリンクするとこれらのシンボルが未解決のままになってしまうようです。このリリースに書かれているとおり、リンク時のオプションに-lircを加えてやると正常に動くようになりました。

[_intel_fast_memsetや_intel_fast_memcpyのエラーが出るときは の続きを読む]

    at 20:28 |
    2008/01/03

    Intel C++ Compiler(icc) をインストールする

    icc  c  cpp  intel 

    今さらな感じですが、コンパイラをgccからインテル純正のコンパイラ(Intel C++ Compiler)に変えてみました。gccと比べて最適化されたバイナリを吐いてくれるので、該当するソフトウェアをリコンパイルするだけで多少性能が向上するようです。

    インテル ソフトウェア開発製品 - インテル ソフトウェア・ネットワーク

    インテルは、非商用ソフトウェアの開発者を対象にした無料の Linux* ツールの拡充を図っています。これらのツールは、余暇を利用して無償のソフトウェアを開発している開発者にのみ提供されます。

    有償のプロプライエタリなプロダクトですが、Linux版は個人で非営利の場合には無償で利用できるライセンスが用意されているので、今回はこれを使います。

    [Intel C++ Compiler(icc) をインストールする の続きを読む]

      at 19:20 |
      «Prev || 1 · | Next»
      » ArchiveList (Tag for "icc" )