1. ホーム
  2. linux

[解決済み] 特定のglibcのバージョンにリンクするにはどうしたらいいですか?

2022-04-27 17:58:56

質問

Ubuntu Lucid 10.04 PCで何かをコンパイルすると、glibcに対してリンクされます。Lucidはglibcの2.11を使用しています。このバイナリを古いglibcを持つ別のPCで実行すると、コマンドはglibc 2.11がないといって失敗します...。

私の知る限り、glibcはシンボルバージョニングを使用しています。特定のシンボルバージョンに対してリンクするようにgccを強制することはできますか?

具体的な使い方としては、ARM用のgccクロスツールチェーンをコンパイルしようと思っています。

どのように解決するのですか?

glibcがシンボルバージョニングを使用していることは正しいです。 もし興味があるなら、glibc 2.1 で導入されたシンボル・バージョニングの実装は以下のように記述されています。 こちら で説明したSunのシンボルバージョニングスキームを拡張したものです。 こちら .

バイナリを静的にリンクするのも一つの方法です。 これはおそらく最も簡単なオプションです。

また、バイナリを chroot ビルド環境でビルドしたり、glibc の 新しい => glibc- 古い クロスコンパイラです。

によると http://www.trevorpounds.com ブログ記事 古いバージョンのシンボルへのリンク (glibc) を使用することで、有効である限り、任意のシンボルを古いものと強制的にリンクさせることが可能です。 .symver バージョン管理されたシンボルを定義するために使用される疑似操作です。 次の例は、この擬似オペレーティング・システムと同じように ブログ記事 .

次の例は、glibc の realpath を利用していますが、古い 2.2.5 のバージョンに対してリンクされていることを確認しています。

#include <limits.h>
#include <stdlib.h>
#include <stdio.h>

__asm__(".symver realpath,realpath@GLIBC_2.2.5");
int main()
{
    const char* unresolved = "/lib64";
    char resolved[PATH_MAX+1];

    if(!realpath(unresolved, resolved))
        { return 1; }

    printf("%s\n", resolved);

    return 0;
}