지난 반나절 동안 적어도 다음과 같은 문제가 발생했습니다.
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이 포함되어 있는 것으로 나타났습니다.
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
무슨 일이 일어나고 있나요? 저는 소스에서 이 프로그램을 만들고 있습니다. 현명한 관리자는 다음과 같이 결정했습니다.
- 모든 사람이 자신과 정확히 동일한 시스템 및 OS 구성에서 실행됩니다.
$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 구현을 사용하는 경우). 사용자 환경을 편집하는 것은 다음과 같이 볼 수 있습니다.나쁜 놈의 행동.