5장. Supplementary topics
5.1. 컴파일러 및 개발 도구의 변경 사항 손상
일치하지 않는 PTHREAD_STACK_MIN
,MINSIGSTKSZ
, SIGSTKSZ
매크로
확장 가능한 벡터 레지스터를 위한 변수 스택 크기가 필요한 아키텍처를 더 잘 지원하기 위해 PTHREAD_STACK_MIN
,MINSIGSTKSZ
, SIGSTKSZ
매크로의 상수 값이 sysconf
호출과 같은 비대화 값으로 변경되었습니다.
더 이상 PTHREAD_STACK_MIN
,MINSIGSTKSZ
및 SIGSTKSZ
매크로를 상수 값처럼 처리하는 방식으로 사용할 수 없습니다. PTHREAD_STACK_MIN
,MINSIGSTKSZ
매크로 및 SIGSTKSZ
매크로에 대해 반환된 값은 이제 긴 데이터 유형이며 size_t
와 같은 서명되지 않은 값과 비교할 때 컴파일러 경고를 생성할 수 있습니다.
libc.so.6
에 병합된 라이브러리
이번 업데이트를 통해 다음 라이브러리가 libc
라이브러리에 병합되어 더 원활한 인플레이스(In-place-upgrade) 환경을 제공하고, 프로세스를 통해 안전하게 스레딩을 지원하고, 내부 구현을 단순화합니다.
-
libpthread
-
libdl
-
libutil
-
libanl
또한 libresolv
라이브러리의 일부가 libc로 이동하여 NSS(Name Switch Service) 파일과 DNS(Domain Name System) 플러그인을 libc
라이브러리로 직접 이동할 수 있습니다. NSS 파일과 DNS 플러그인은 이제 libc
라이브러리에 직접 빌드되어 업그레이드 중에 또는 chroot
또는 컨테이너 경계에서 사용할 수 있습니다. chroot
또는 컨테이너 경계에서 사용하는 사용은 해당 소스에서 IdM(Identity Management) 데이터를 안전하게 쿼리할 수 있도록 지원합니다.
zdump
유틸리티의 새 위치
/usr/bin/zdump
는 zdump
유틸리티의 새 위치입니다.
sys_siglist
,_sys_siglist
, sys_sigabbrev
기호 사용 중단
sys_siglist
,_sys_siglist
및 sys_sigabbrev
기호는 이전 바이너리를 지원하기 위해 호환성 기호로만 내보냅니다. 모든 프로그램은 대신 strsignal
기호를 사용해야 합니다.
sys_siglist
,_sys_siglist
및 sys_sigabbrev
기호를 사용하면 배열 액세스를 확인하지 않고 복사 재배치 및 ABI(Error-prone Application Binary Interface)와 같은 문제가 생성됩니다.
이러한 변경 사항은 일부 패키지의 소스에서 빌드에 영향을 줄 수 있습니다. 이 문제를 해결하려면 프로그램을 다시 작성하여 strsignal
기호를 대신 사용합니다. 예를 들면 다음과 같습니다.
#include <signal.h> #include <stdio.h> static const char *strsig (int sig) { return sys_siglist[sig]; } int main (int argc, char *argv[]) { printf ("%s\n", strsig (SIGINT)); return 0; }
다음과 같이 조정해야 합니다.
#include <signal.h> #include <stdio.h> #include <string.h> static const char *strsig (int sig) { return strsignal(sig); } int main (int argc, char *argv[]) { printf ("%s\n", strsig (SIGINT)); return 0; }
또는 glibc-2.32
GNU 확장 sigabbrev_np
또는 sigdescr_np
를 사용하려면 다음을 수행합니다.
#define _GNU_SOURCE #include <signal.h> #include <stdio.h> #include <string.h> static const char *strsig (int sig) { const char *r = sigdescr_np (sig); return r == NULL ? "Unknown signal" : r; } int main (int argc, char *argv[]) { printf ("%s\n", strsig (SIGINT)); printf ("%s\n", strsig (-1)); return 0; }
두 확장 모두 async-signal-safe 및 multithread-safe입니다.
sys_errlist , _
,sys_errlist
sys_nerr
및 _sys_nerr
기호의 사용 중단
sys_errlist
,_sys_errlist
,sys_nerr
및 _sys_nerr
기호는 이전 바이너리를 지원하기 위한 호환성 기호로만 내보냅니다. 모든 프로그램은 strerror
또는 strerror_r
기호를 대신 사용해야 합니다.
sys_errlist
,_sys_errlist
,
기호를 사용하면 배열 액세스에 대한 명시적 바인딩이 없는 복사 재배치 및 오류 발생 ABI와 같은 문제가 생성됩니다.
sys_nerr
이러한 변경 사항은 일부 패키지의 소스에서 빌드에 영향을 줄 수 있습니다. 문제를 해결하려면 strerror
또는 strerror_r
기호를 사용하여 프로그램을 다시 작성합니다. 예를 들면 다음과 같습니다.
#include <stdio.h> #include <errno.h> static const char *strerr (int err) { if (err < 0 || err > sys_nerr) return "Unknown"; return sys_errlist[err]; } int main (int argc, char *argv[]) { printf ("%s\n", strerr (-1)); printf ("%s\n", strerr (EINVAL)); return 0; }
다음과 같이 조정해야 합니다.
#include <stdio.h> #include <errno.h> static const char *strerr (int err) { return strerror (err); } int main (int argc, char *argv[]) { printf ("%s\n", strerr (-1)); printf ("%s\n", strerr (EINVAL)); return 0; }
또는 glibc-2.32
GNU 확장 strerrorname_np
또는 strerrordesc_np
를 사용하려면 다음을 실행합니다.
#define _GNU_SOURCE #include <stdio.h> #include <errno.h> #include <string.h> static const char *strerr (int err) { const char *r = strerrordesc_np (err); return r == NULL ? "Unknown error" : r; } int main (int argc, char *argv[]) { printf ("%s\n", strerr (-1)); printf ("%s\n", strerr (EINVAL)); return 0; }
두 확장 모두 async-signal-safe 및 multithread-safe입니다.
사용자 공간 메모리 al Cryostat, malloc
, 변경 사항
mallwatch
및 tr_break
기호는 더 이상 사용되지 않으며 mtrace
함수에서 더 이상 사용되지 않습니다. GDB 내에서 mtrace
함수 내에서 조건부 Cryostat를 사용하여 유사한 기능을 얻을 수 있습니다.
__morecore
및 __after_morecore_hook
malloc
후크 및 기본 구현인 __default_morecore
가 API에서 제거되었습니다. 기존 애플리케이션은 이러한 기호에 대해 계속 연결되지만 인터페이스는 더 이상 malloc
에 영향을 미치지 않습니다.
MALLOC_CHECK_
환경 변수(또는 glibc.
튜닝 가능 항목), malloc
.checkmtrace()
및 mcheck()
와 같은 malloc의 디버깅 기능이 기본 C 라이브러리에서 기본적으로 비활성화되어 있습니다. 이러한 기능을 사용하려면 새 libc_malloc_debug.so
디버깅 DSO를 미리 로드합니다.
더 이상 사용되지 않는 함수 malloc_get_state
및 malloc_set_state
가 코어 C 라이브러리에서 libc_malloc_debug.so
라이브러리로 이동되었습니다. 이러한 기능을 계속 사용하는 레거시 애플리케이션은 이제 LD_PRELOAD
환경 변수를 사용하여 환경에 libc_malloc_debug.so
라이브러리를 사전 로드해야 합니다.
더 이상 사용되지 않는 메모리 할당 후크 __malloc_hook
,__realloc_hook
,__memalign_hook
, __free_hook
가 API에서 제거됩니다. 호환성 기호는 레거시 프로그램을 지원하기 위해 존재하지만 새로운 애플리케이션은 더 이상 이러한 기호에 연결할 수 없습니다. 이러한 후크는 더 이상 glibc
기능에 영향을 미치지 않습니다. malloc
디버깅 DSO libc_malloc_debug.so
는 현재 후크를 지원하며 이전 프로그램에 대해 이 기능을 다시 가져오도록 사전 로드할 수 있습니다. 그러나 이는 전환 조치이며 향후 GNU C 라이브러리 릴리스에서 제거될 수 있습니다. 자체 malloc
상호 위치 라이브러리를 작성하고 사전 로드하여 이러한 후크에서 제외할 수 있습니다.
지연 바인딩 실패가 프로세스를 종료합니다.
dlopen
함수 중에 지연 바인딩 오류가 발생하는 경우 ELF 생성자를 실행하는 동안 프로세스가 종료됩니다. 이전에는 동적 로더가 dlopen
에서 dlerror
메시지로 캡처된 lazy 바인딩 오류와 함께 NULL
을 반환했습니다. 일반적으로 임의의 함수 호출에서 스택을 재설정할 수 없기 때문에 이는 안전하지 않습니다.
stime
함수 사용 중단
stime
함수는 새로 연결된 바이너리에 더 이상 사용할 수 없으며 해당 선언은 < time.h>에서 제거되었습니다
. 대신 시스템 시간을 설정하는 프로그램에 clock_settime
함수를 사용합니다.
팝업
및 시스템
기능은 더 이상 atfork
처리기를 실행하지 않음
가능한 POSIX 위반이지만 atfork
처리기와 관련된 pthread_atfork
설명서의 POSIX는 다중 스레드 프로세스에서 포크 호출 후 일관성 없는 뮤지션 상태를 처리하는 것입니다. 팝업 및 시스템 함수 모두에서 사용자 정의 뮤지션에 직접 액세스할 수 없습니다.In both the popen
and system
functions there is no direct access to user-defined mutexes.
C++ 표준 라이브러리에서 사용되지 않는 기능
-
STD::string::reserve(n)
는 문자열의 현재 용량보다 작은 인수로 호출되면 더 이상 문자열 용량을 감소시키지 않습니다. 인수 없이reserve()
를 호출하여 문자열 용량을 줄일 수 있지만 해당 형식은 더 이상 사용되지 않습니다. 대신 동일한shrink_to_tune()
을 사용해야 합니다. -
비표준
std::_is_nullptr_t
유형 트레잇은 더 이상 사용되지 않습니다. 대신 표준std::is_null_pointer
특성을 사용해야 합니다.