6

アプリケーションを実行しようとするとエラーが発生します。

/lib/libc.so.6: version `GLIBC_2.7' not found

しかし、glibc2.7から必要な唯一のシンボルは

__isoc99_sscanf@@GLIBC_2.7 

このシンボルを__sscanf()のエイリアスとして使用して、小さな単一の関数「ライブラリ」を作成したいと思います。

gcc / ldでこれを行うにはどうすればよいですか?

「@@」記号が原因で、私のバリアントは受け入れられません

 int __isoc99_sscanf@@GLIBC_2.7(const char *, const char *, ...) __attribute__((alias("__sscanf")));

2番目に私の変種は

#include <stdarg.h>
int __isoc99_sscanf1(const char *a, const char *b, va_list args)
{
   int i;
   va_list ap;
   va_copy(ap,args);
   i=sscanf(a,b,ap);
   va_end(ap);
   return i;
}

   // __asm__(".symver __isoc99_sscanf,__isoc99_sscanf@@GLIBC_2.7");
    __asm__(".symver __isoc99_sscanf1,__isoc99_sscanf@@GLIBC_2.7");

ただし、リンカからの「シンボル__isoc99_sscanf@@GLIBC_2.7のバージョンノードが見つかりません」エラーで終了します。

4

2 に答える 2

4

2 番目のバージョンは、次のスクリプトで動作します。

GLIBC_2.7 {
 global: __isoc99_sscanf;
 local: *;
};

ただし、を使用-Wl,--version-script=script.txtすると、元の にアクセスする方法がわかりませんsscanf@GLIBC_2.4

-D_GNU_SOURCEとにかく、代わりに使用したいかもしれません。極力避けること__isoc99_sscanf

于 2010-09-27T04:10:34.600 に答える
2

私は@felipecsの答えがとても役に立ちました。さらに、私たちのアプリケーションは ocaml を使用して動的リンクを実行する必要がありました。指定されたスクリプトは、アプリケーションが __isoc99_sscanf シンボルのみをグローバルとしてエクスポートするため、このシナリオでは機能しないことがわかりました。

GLIBC_2.7 {
 global: *;
};

上記のスクリプトはこの問題を解決し、ocaml の動的リンカーが適切に機能するようにします。-D_GNU_SOURCEGLIBC_2.7 への依存関係は、静的にリンクしているビルド済みのバイナリに由来するため、このオプションを単独で使用するだけでは、この問題を回避するのに十分ではありませんでした。

于 2011-03-28T07:34:04.360 に答える