이상한 LD_PRELOAD 오류 및 포함 파일 누락 - 배포판이 손상되었습니까?

이상한 LD_PRELOAD 오류 및 포함 파일 누락 - 배포판이 손상되었습니까?

지난 반나절 동안 적어도 다음과 같은 문제가 발생했습니다.

  1. LD_PRELOAD내 포함 에 대한 LD_PRELOAD 항목 누락에 대한 오류가 발생 /lib64/libstdc++.so.6하지만(이것이 의미가 있는지 확실하지 않음) 파일이 누락되었으므로 무엇이든 실행할 때마다 다음과 같은 결과를 얻습니다.

    ERROR: ld.so: object '/lib64/libstdc++.so.6' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
    

그래서 LD_PRELOAD를 살펴보니 존재하지 않는 /lib64/libstdc++.so.6이 포함되어 있는 것으로 나타났습니다.

  1. CMake를 사용하여 프로젝트를 빌드하려고 하면 다음 오류와 함께 구성이 실패합니다.

    In file included from /usr/include/pthread.h:23:0,
                 from /home/eyalroz/src/mine/cuda-api-wrappers/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:
    /usr/include/sched.h:28:20: fatal error: stddef.h: No such file or directory
    

하지만 내 것은 stdddef.h이미 안전해요 /usr/include/linux/stddef.h.

나는 GNU/Linux Mint 18.3을 사용하고 있으며 최근에 내 시스템에 이상한 짓을 한 적이 없습니다(음, 어쨌든 기억이 나지 않습니다).

답변1

무슨 일이 일어나고 있나요? 저는 소스에서 이 프로그램을 만들고 있습니다. 현명한 관리자는 다음과 같이 결정했습니다.

  1. 모든 사람이 자신과 정확히 동일한 시스템 및 OS 구성에서 실행됩니다.
  2. $HOME/.bashrc빌드 스크립트에서 가정을 할 수 있도록 모든 설정을 설정에 넣어야 합니다 .

이로 인해 나는 .bashrc여기저기로 export CC, , export CXX, export C_INCLUDE_PATH그리고 LD_PRELOAD더 많은 것을 알게 되었습니다. 이것은 일을 엉망으로 만듭니다.

교훈: 항상 ~/.profile, ~/.shrc, ~/.bashrc, ~/.bash_profile,에 ~/.login이상한 ~/.bash_login새 항목이 있는지 확인하세요.

답변2

표준 설정이 LD_PRELOAD사용됨 에 따라정말 나쁜 생각이야실행하는 모든 소프트웨어의 동작에 영향을 미칠 수 있기 때문입니다.

의도된 용도 LD_PRELOAD는 주로 디버깅입니다. 보조 사용 사례로 malloc()기본 구현을 사용에 더 적합한 다른 구현으로 바꿀 수 있습니다.

LD_PRELOAD디버깅을 위한 예를 들어보겠습니다. 코어 덤프를 시작하는 프로그램이 있고 이것이 NULL 포인터 역참조의 결과일 수 있다고 의심한다고 가정하겠습니다. 이 경우 다음으로 전화할 수 있습니다.

[email protected] program

이것이 더 이상 코어를 덤프하지 않으면 NULL 포인터 역참조가 발생합니다.

참고: 예측 가능한 빌드를 좋아한다면 빌드 환경은 다음과 같아야 합니다.

# clear environment variables we know to be bad for the build 
unset LD_OPTIONS 
unset LD_AUDIT          LD_AUDIT_32             LD_AUDIT_64 
unset LD_BIND_NOW       LD_BIND_NOW_32          LD_BIND_NOW_64 
unset LD_BREADTH        LD_BREADTH_32           LD_BREADTH_64 
unset LD_CONFIG         LD_CONFIG_32            LD_CONFIG_64 
unset LD_DEBUG          LD_DEBUG_32             LD_DEBUG_64 
unset LD_DEMANGLE       LD_DEMANGLE_32          LD_DEMANGLE_64 
unset LD_FLAGS          LD_FLAGS_32             LD_FLAGS_64 
unset LD_LIBRARY_PATH   LD_LIBRARY_PATH_32      LD_LIBRARY_PATH_64 
unset LD_LOADFLTR       LD_LOADFLTR_32          LD_LOADFLTR_64 
unset LD_NOAUDIT        LD_NOAUDIT_32           LD_NOAUDIT_64 
unset LD_NOAUXFLTR      LD_NOAUXFLTR_32         LD_NOAUXFLTR_64 
unset LD_NOCONFIG       LD_NOCONFIG_32          LD_NOCONFIG_64 
unset LD_NODIRCONFIG    LD_NODIRCONFIG_32       LD_NODIRCONFIG_64 
unset LD_NODIRECT       LD_NODIRECT_32          LD_NODIRECT_64 
unset LD_NOLAZYLOAD     LD_NOLAZYLOAD_32        LD_NOLAZYLOAD_64 
unset LD_NOOBJALTER     LD_NOOBJALTER_32        LD_NOOBJALTER_64 
unset LD_NOVERSION      LD_NOVERSION_32         LD_NOVERSION_64 
unset LD_ORIGIN         LD_ORIGIN_32            LD_ORIGIN_64 
unset LD_PRELOAD        LD_PRELOAD_32           LD_PRELOAD_64 
unset LD_PROFILE        LD_PROFILE_32           LD_PROFILE_64 

# 
# force locale to C
unset LC_ALL
LC_COLLATE=C;   export LC_COLLATE 
LC_CTYPE=C;     export LC_CTYPE 
LC_MESSAGES=C;  export LC_MESSAGES 
LC_MONETARY=C;  export LC_MONETARY 
LC_NUMERIC=C;   export LC_NUMERIC 
LC_TIME=C;      export LC_TIME 

자동 빌드를 제어하는 ​​스크립트 또는 makefile(makefile 내에서 환경 변수 관리를 지원하는 make 구현을 사용하는 경우). 사용자 환경을 편집하는 것은 다음과 같이 볼 수 있습니다.나쁜 놈의 행동.

관련 정보