2011-01-31 21 views
2

私はプログラマーではないとバットを断言し、おそらく私の頭の上にいるでしょう。C/C++プログラムから__strlen_sse2を呼び出すにはどうすればよいですか? [Linux]

libc6-i686の一部としてDebianにインストールされている__strlen_sse2(アセンブリ)関数のバグを追跡しようとしています。

すでにアセンブリコード(.Sファイル)のコピーがあり、C/C++プログラムから呼び出す方法を理解する必要があります。どうすればこれを達成できますか?

編集:

は、このコードを試してみましたが、私は

編集2「__strlen_sse2」への未定義参照についてはgccからエラーが表示されます。それは、この質問に対する正しい答えであるというのが私の理解ですが、I完了までそれを運ぶための適切な知識が不足しています。みんな助けてくれてありがとう。

#include <stdio.h> 
#include <string.h> 

size_t __strlen_sse2(const char *); 

void main() 
{ 
    char buffer[255]; 

    printf("Standby.. "); 
    gets(buffer); 
    __strlen_sse2("CRASH!"); 
    printf("OK!\n"); 
} 

私が言ったように...プログラマではありません。

私の質問が意味をなさないことを願っています。これ以上の情報が必要な場合はお知らせください。

答えて

2

通常は動的にリンクされた/lib/libc.so.6の中には__strlen_sse2のコピーを直接呼び出すことはできません。これはlibc自体のコードにはアクセスできますが、外部リンクでは使用できない「隠しシンボル」です。

glibcのソースコードから__strlen_sse2と定義されているファイルが.Sであるとしますが、glibc以外でビルド可能であるように変更する必要があります。私は正しいファイルだと思っていて、かなり簡単に修正することができました。ただ

 .text 

を読み込む行を含めないまで以外のすべてを削除し、これでそれを置き換える:

#define PUSH(REG)  pushl REG 
#define POP(REG)  popl REG 
#define PARMS   4 
#define STR    PARMS 
#define ENTRANCE 
#define RETURN   ret 
#define L(x)   .L##x 
#define ENTRY(x)  .globl x; .type x,@function; x: 
#define END(x)   .size x, .-x 

はまた、ファイルの一番最後に #endif行を削除します。次にコンパイルします。

gcc -m32 -c strlen-sse2.S 
gcc -m32 -c test.c 
gcc -m32 test.o strlen-sse2.o 
./a.out 

-m32は必要ありません。

superuser.comから大きな問題を解決するには、/proc/cpuinfoの内容をお伝えください。

+0

うわー、素晴らしい答え。私が何をしたのかを達成するための具体的な手順をありがとう。悲しいかな、私の大きな問題はこの特定の機能に関連していないようです。少なくとも私はそれを排除することができました。再度、感謝します。 –

1

関数を、好ましくは完全なプロトタイプで宣言し、呼び出すだけです。私はあなたがこの機能のバグを追跡しようとしているあなたの主張のビットは懐疑的だ

size_t __strlen_sse2(const char *); 

:これはおそらく右のプロトタイプです。無効な引数(無効なポインタまたはヌルで終了する文字列以外へのポインタ)を使用してstrlenを呼び出しているプログラムにバグがある可能性があります。

+0

返信いただきありがとうございます。私はこれを試して、報告するつもりです。クラッシュしているプログラムは、実際にはinitとbashです。複雑な状況ですが、問題が何であれ、libcの内部で発生し、再現可能であることを確認する必要があります(少なくとも私のシステムでは)。そうすれば、私は適切なバグ報告をすることができます。 –

+0

あなたのコードを試しましたが、コンパイラは関数への未定義の参照について苦情を言いました。私には負担してください。これは私の新しい領域です。 –

+0

それはコンパイラかリンカでしたか?それがリンカなら、おそらくあなたが '__strlen_sse2'を含むファイルにリンクしていないからでしょう。 –

関連する問題