5장. Supplementary topics


5.1. 컴파일러 및 개발 도구의 변경 사항 손상

일치하지 않는 PTHREAD_STACK_MIN,MINSIGSTKSZ, SIGSTKSZ 매크로

확장 가능한 벡터 레지스터를 위한 변수 스택 크기가 필요한 아키텍처를 더 잘 지원하기 위해 PTHREAD_STACK_MIN,MINSIGSTKSZ, SIGSTKSZ 매크로의 상수 값이 sysconf 호출과 같은 비대화 값으로 변경되었습니다.

더 이상 PTHREAD_STACK_MIN,MINSIGSTKSZSIGSTKSZ 매크로를 상수 값처럼 처리하는 방식으로 사용할 수 없습니다. 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/zdumpzdump 유틸리티의 새 위치입니다.

sys_siglist,_sys_siglist, sys_sigabbrev 기호 사용 중단

sys_siglist,_sys_siglistsys_sigabbrev 기호는 이전 바이너리를 지원하기 위해 호환성 기호로만 내보냅니다. 모든 프로그램은 대신 strsignal 기호를 사용해야 합니다.

sys_siglist,_sys_siglistsys_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, sys_nerr 기호를 사용하면 배열 액세스에 대한 명시적 바인딩이 없는 복사 재배치 및 오류 발생 ABI와 같은 문제가 생성됩니다.

이러한 변경 사항은 일부 패키지의 소스에서 빌드에 영향을 줄 수 있습니다. 문제를 해결하려면 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, 변경 사항

mallwatchtr_break 기호는 더 이상 사용되지 않으며 mtrace 함수에서 더 이상 사용되지 않습니다. GDB 내에서 mtrace 함수 내에서 조건부 Cryostat를 사용하여 유사한 기능을 얻을 수 있습니다.

__morecore__after_morecore_hook malloc 후크 및 기본 구현인 __default_morecore 가 API에서 제거되었습니다. 기존 애플리케이션은 이러한 기호에 대해 계속 연결되지만 인터페이스는 더 이상 malloc 에 영향을 미치지 않습니다.

MALLOC_CHECK_ 환경 변수(또는 glibc. malloc.check 튜닝 가능 항목), mtrace()mcheck() 와 같은 malloc의 디버깅 기능이 기본 C 라이브러리에서 기본적으로 비활성화되어 있습니다. 이러한 기능을 사용하려면 새 libc_malloc_debug.so 디버깅 DSO를 미리 로드합니다.

더 이상 사용되지 않는 함수 malloc_get_statemalloc_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 특성을 사용해야 합니다.
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.