非常に簡単な要約:
cat "$file" | patch
エラーは生成されますBad file descriptor
が、
patch < "$file"
libtrashは事前にロードされ、LD_PRELOAD
大規模プロジェクトでのみ機能します。
説明する: この例では、[1]からダウンロードしたlinux-3.18.21カーネルソースコードを使用しました(もちろんアーカイブも抽出されました)。
ダウンロードしたvon [2]でTuxOnIceを使用してパッチを適用して解凍したいと思います。
この例では、小さなファイルだけですべてがうまくいくので、いくつかの大きなプロジェクトを紹介します。
私はパッチがあるトップレベルのLinuxソースディレクトリで作業しています../patches/tuxonice-for-linux-3.18.21-2015-09-08.patch
。関連するシンボリックリンクはなく、すべてが同じファイルシステムにあります。
次のようなことが発生します。
$ cat ../patches/tuxonice-for-linux-3.18.21-2015-09-08.patch | patch -p1 --dry-run
patch: **** can't open file Documentation/kernel-parameters.txt : Bad file descriptor
(終了コード:2)
しかし、:
$ patch -p1 --dry-run < ../patches/tuxonice-for-linux-3.18.21-2015-09-08.patch
checking file Documentation/kernel-parameters.txt
checking file Documentation/power/tuxonice-internals.txt
[...]
(成功的に実行されます)。
libtrash.so
この問題は、環境変数を介したロードに関連していますLD_PRELOAD
。
export LD_PRELOAD=/usr/lib/libtrash.so
デフォルトでは[3]があります。- I
export LD_PRELOAD=''
または裏面はunset LD_PRELOAD
正常に動作します。 export TRASH_OFF=YES
libtrashが提供する手段を介してlibtrashの機能をオフにしても(しかしプリロードされたまま)、問題はまだ存在します。- libtrash自体ではなくlibtrashに関連している必要があります
LD_PRELOAD
。これは、Iexport LD_PRELOAD='/usr/lib/libgtk3-nocsd.so.0'
(ファイルが存在する)のときにパッチがcat $file | patch
機能するためです。
事実cat "$file" | "$programme"
と同じ結果が出ると予想したのです"$programme" < "$file"
が、そうではありませんでした。
実際には使用せず、代わりに圧縮cat
パッチファイルのようなxzcat
ものを使用してbzcat
追加のステップで最初に解凍する必要がないため、これは本当に面倒な作業です。
を使用しますが(同じ範囲bash
内で)重要ではありません。 1.2.10を示すGNUパッチバージョン2.7.5。私はアーチLinuxディストリビューションを使用していますが、この問題は実際にはアップデートを含む少なくとも数ヶ月間続きました。カーネル 3.18.21.zsh
patch
glib-config --version
strace
以下は、Once strace
-ing cat
、Once strace
-ing patch
、および2つの出力export LD_PRELOAD=/usr/lib/libtrash.so
ですexport TRASH_OFF=YES
。
注文する:
$ strace cat ../patches/tuxonice-for-linux-3.18.21-2015-09-08.patch | patch -p1 --dry-run
出力:
注文する:
$ cat ../patches/tuxonice-for-linux-3.18.21-2015-09-08.patch | strace patch -p1 --dry-run
出力:
(リンクして申し訳ありません。直接入れると、stackexchangeは理由を知らせず、私の投稿を受け入れません。)
strace
私は動的リンクなどに精通していません。
何が起こっているのか知っている人はいますか?これがどこかで間違いだったら、どこですか? (パッチ、libc、libtrash、動的リンカー、...、...、?)
xzcat /usr/src/linux-3.18.21.tar.xz | tar -xv
動作しますが、xzcat some.patch.xz | patch
動作しないので、少なくともpatch
。
[1]Linuxカーネル:https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.18.21.tar.xz
[2]氷の上のタキシード:http://tuxonice.nigelcunningham.com.au/downloads/all/tuxonice-for-linux-3.18.21-2015-09-08.patch.bz2
[3]図書館ごみ:http://pages.stern.nyu.edu/~marriaga/software/libtrash/
答え1
libtrash
壊れる:
たとえば、次のようになりますhelpers.c
。
char* make_absolute_path_from_dirfd_relpath(int dirfd, const char *arg_pathname)
{
char *abs_path = NULL;
if (arg_pathname == NULL)
{
return NULL;
}
else if (arg_pathname[0] == '/' || dirfd == AT_FDCWD)
{
return arg_pathname;
}
else if (dirfd <= 0)
{
errno = EBADF;
return NULL;
}
0
ファイル記述子の値は完全に正当です。リダイレクトを使用しているので、stdin
つまりファイル記述子を読んでいます0
。私はこれがどこかで起こる問題だと思いますlibtrash
。
答え2
Andrew Henleが指摘したように、これはlibtrashのバグによるものです。私は投稿しました。新バージョンこれはこの問題を解決します。