glibc-2.25のさまざまなバージョン(sse4、ssse3、avx2、avx512)のいくつかのメモリ関数(memcpy、memset、memmove)が、 Linux(glibc 2.12)。
私の最初の試みは、glibc-2.25のタールボールをダウンロードし、こちらの手順に従ってください。https://sourceware.org/glibc/wiki/Testing/Buildsです。私は手動でカーネルのバージョンチェックをコメントアウトし、すべてうまくいった。そして、プログラムはglibcのウィキと「LDDテスト」の「glibcのビルドツリーに対してコンパイル」セクションに記載された手順で、新しく建てられたglibcにリンクされたテストでは、それは確かに予想ライブラリに依存することを示しています。ポートglibc 2.25とテストメモリ関数
# $GLIBC is /data8/home/wentingli/temp/glibc/build
libm.so.6 => /data8/home/wentingli/temp/glibc/build/math/libm.so.6 (0x00007fe42f364000)
libc.so.6 => /data8/home/wentingli/temp/glibc/build/libc.so.6 (0x00007fe42efc4000)
/data8/home/wentingli/temp/glibc/build/elf/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fe42f787000)
libdl.so.2 => /data8/home/wentingli/temp/glibc/build/dlfcn/libdl.so.2 (0x00007fe42edc0000)
libpthread.so.0 => /data8/home/wentingli/temp/glibc/build/nptl/libpthread.so.0 (0x00007fe42eba2000)
実際に呼び出されたmemset/memcpyを確認するためにgdbを実行しますが、関数のより高度なバージョン(avx2、avx512)がin useであると予想されている間は常に__memset_sse2_unaligned_ermsが使用されていることを示しています。 私の質問は以下のとおりです。
- はglibcの-2.25は、自動的にCPU/OS /メモリアドレスに応じてメモリ機能の最適なバージョンを選択しましたか?そうでない場合は、glibcの構築中に設定が失われているか、セットアップに何か問題がありますか?
- 新しいglibcからメモリ関数を移植するための他の選択肢はありますか?
ご意見やご提案をいただければ幸いです。
[glibc wiki](https://sourceware.org/glibc/wiki/Testing/Builds)は、新しいglibcをテストするためのいくつかのアプローチを提供していますが、これは生産環境では少し複雑で不適切です。通常は、fundermantalコアシステムコンポーネントであるglibcを置き換えるべきではないという提案に従います。これらの文字列関数を別々に構築するのはちょっと面倒です(特にキャッシュ/ CPUの検出) – WindLeeWT
あなたの返事には大変感謝しています。 LD_PRELOADで新しいglibcを使うと、プログラムが不安定になり、予期せずクラッシュする可能性があります。 – WindLeeWT
ビルドディレクトリの 'testrun.sh'スクリプトと同様に、アンインストールされたglibcに対してプログラムを実行するには、明示的な動的リンカ呼び出しを使用する必要があります。 –