매우 간략한 요약:
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입니다. 저는 아치 리눅스 배포판을 사용하고 있으며 이 문제는 실제로 업데이트를 포함하여 적어도 몇 달 동안 계속되었습니다. 커널 3.18.21.zsh
patch
glib-config --version
strace
다음은 Once strace
-ing cat
, Once strace
-ing patch
및 두 가지 출력 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]리눅스 커널: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의 버그 때문입니다. 방금 포스팅했어요새로운 버전이렇게 하면 이 문제가 해결됩니다.