맨위로가기

동적 링커

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

동적 링커는 컴퓨터 프로그램에서 모듈을 연결하는 방식 중 하나로, 프로그램 실행 시작 시 로더에 의해 다른 모듈과 결합하는 방식을 말한다. 정적 링킹과 비교하여 코드 중복을 줄여 모듈 크기를 작게 하고, 라이브러리 인터페이스 변경 시 프로그램 재링크를 피할 수 있다는 장점이 있다. 동적 링킹은 DLL(Windows), .so(Unix-like), .dylib(macOS, iOS) 등 운영체제별로 다양한 방식으로 구현되며, 플러그인 메커니즘을 구현하는 데 활용되기도 한다. 하지만 실행 시 오버헤드와 외부 라이브러리 의존성으로 인한 문제점도 존재한다.

더 읽어볼만한 페이지

  • 컴파일러 - 바이너리 재컴파일러
  • 컴파일러 - 링커 (컴퓨팅)
    링커는 여러 모듈로 된 목적 파일을 결합해 실행 가능한 프로그램을 만들고, 정적/동적 링킹으로 라이브러리를 연결하며, 심볼 해결 및 재배치로 변수와 함수를 메모리 주소에 연결하는 소프트웨어 도구이다.
  • 라이브러리 - 바이너리 재컴파일러
  • 라이브러리 - 동적 링크 라이브러리
    동적 링크 라이브러리(DLL)는 윈도우 운영체제에서 프로그램 실행 시 필요한 코드와 데이터를 제공하며, 여러 프로그램에서 공유되어 메모리 효율성을 높이고 모듈성을 향상시키는 라이브러리 형식이다.
  • 취약점 공격 - 보안 취약점
    보안 취약점은 시스템의 설계, 구현, 운영, 관리상 결함이나 약점으로, 위협에 의해 악용되어 시스템 보안 정책을 위반할 수 있는 요소이며, ISO 27005, IETF RFC 4949, NIST SP 800-30, ENISA 등 다양한 기관에서 정의하고 있다.
  • 취약점 공격 - 인터넷 보안
    인터넷 보안은 사이버 위협, 악성 소프트웨어, 서비스 거부 공격 등으로부터 정보와 시스템을 보호하기 위해 네트워크 계층 보안, 다단계 인증, 방화벽 등 다양한 기술과 방법을 포괄한다.
동적 링커
개요
종류운영체제의 일부
설명동적 링커(dynamic linker)는 동적 라이브러리를 프로그램이 시작될 때나 실행 중에 프로그램에 링크하는 운영 체제의 일부이다.
역할실행 파일에서 필요로 하는 라이브러리를 찾아 메모리에 로드하고, 실행 파일 내의 심볼릭 참조를 라이브러리 내의 실제 주소로 연결한다.
다른 이름동적 로더 (dynamic loader)
동작 방식
프로그램 실행 시프로그램이 실행될 때, 운영체제는 동적 링커를 호출한다.
동적 링커는 실행 파일이 필요로 하는 동적 라이브러리들을 찾는다.
찾은 라이브러리들을 메모리에 로드한다.
실행 파일 내의 심볼릭 참조를 라이브러리 내의 실제 주소로 연결한다.
특징프로그램이 실행될 때마다 라이브러리를 로드하고 연결한다.
메모리 사용량이 증가할 수 있다.
라이브러리가 업데이트되면 프로그램을 다시 컴파일하지 않아도 된다.
프로그램 실행 중프로그램 실행 중 필요에 따라 동적 라이브러리를 로드하고 연결할 수 있다.
메모리 사용량을 효율적으로 관리할 수 있다.
플러그인 시스템 구현에 유용하다.
구현체
유닉스 계열ld-linux.so (glibc의 일부)
dyld (macOS)
윈도우동적 링크 라이브러리 (DLL) 로더
기능
주소 재배치동적 라이브러리가 로드될 메모리 주소가 미리 결정되지 않으므로, 링커는 라이브러리 내의 코드와 데이터 주소를 프로그램의 주소 공간에 맞게 조정해야 한다.
심볼 해결프로그램이 사용하는 외부 함수나 변수의 위치를 찾아 연결한다.
지연 바인딩함수의 실제 주소 연결을 해당 함수가 처음 호출될 때까지 늦추어 프로그램 시작 시간을 단축한다.
장단점
장점코드 재사용성 증가
프로그램 크기 감소
메모리 효율성 증가
업데이트 용이성
단점프로그램 시작 시간 증가
의존성 관리 복잡성 증가
보안 취약점 발생 가능성
보안
취약점동적 링커는 악성 라이브러리를 로드하여 시스템 보안을 위협할 수 있다.
라이브러리 검색 경로 조작을 통해 악성 라이브러리를 우선적으로 로드하도록 유도할 수 있다.
보안 강화 방법라이브러리 로드 경로 제한
라이브러리 무결성 검증
ASLR (Address Space Layout Randomization) 적용
Safe Linking 사용

2. 프로그램에서의 동적 링킹

'''동적 링킹'''(다이내믹 링킹)은 컴퓨터 프로그램 작성 시 모듈을 빌드하는 방식 중 하나로, 정적 링킹과 대비된다. 프로그램 실행 시점에 로더에 의해 필요한 모듈을 결합하는 방식이며, 윈도우 환경에서는 다이내믹 링크 라이브러리(DLL) 파일 형태로 제공된다.

동적 링킹은 자주 사용되는 서브루틴을 DLL("공유 라이브러리")로 만들어 여러 프로그램에서 공유할 수 있게 해준다.

2. 1. 정적 링킹과의 비교

정적 링킹은 컴파일 시점에 모든 코드를 실행 파일에 포함하는 반면, 동적 링킹은 실행 시점에 필요한 코드를 로드한다.

동적 링킹은 일반적으로 컴파일 시점의 링킹보다 느리다. 더 많은 CPU 사이클이 필요하기 때문이다.[12] 이는 런타임에 실행되는 대부분의 프로세스에서 나타나는 현상이다. 하지만 동적 링킹은 공간 효율적이다(디스크 및 런타임 메모리에서).[13] 라이브러리가 정적으로 링크되면 실행 중인 모든 프로세스는 호출되는 라이브러리 함수 자체 복사본과 연결된다. 따라서 여러 프로그램에서 동일한 라이브러리를 여러 번 호출하는 경우 해당 라이브러리의 동일한 함수가 시스템 메모리의 여러 위치에 중복된다. 공유 동적 라이브러리를 사용하면 컴파일 시간에 각 파일을 자체 라이브러리 복사본에 연결하여 잠재적으로 메모리 공간을 낭비하는 대신, 라이브러리의 복사본이 한 번에 하나만 메모리에 저장되므로 다른 곳에서 사용할 수 있는 메모리 공간이 확보된다.[13] 또한 동적 링킹에서는 실제로 사용되는 경우에만 라이브러리가 로드된다.[14]

대규모 프로그램은 일반적으로 여러 개의 모듈로 분할된다. 라이브러리 또는 응용 프로그램모듈을 빌드할 때, 먼저 컴파일러에 의해 소스 코드로부터 오브젝트 파일이 생성되지만, 각 모듈에 필요한 프로그램 코드의 실체 전부를 링키지 에디터에 의해 링크하여 모듈에 포함시켜 실행 가능한 형식의 바이너리(실행 파일)를 얻는 방식을 정적 링크라고 한다.

이에 반해, 각 모듈에 필요한 프로그램 코드의 실체 전부를 포함하지 않고, 프로그램 실행 시작 시 로더에 의해 처음으로 다른 모듈과 결합하는 방식을 동적 링크라고 한다.

동적 링크의 장점으로는, 중복되는 코드나 데이터가 줄어들어 모듈의 크기를 작게 할 수 있다는 점, 그리고 라이브러리의 구현을 변경했을 때, 라이브러리의 인터페이스에 변경이 없다면 프로그램을 다시 링크할 필요가 없다는 점이 있다.[15]

동적 링크의 단점으로는, 모듈 자체에 필요한 코드가 포함되어 있지 않아 자기 완결할 수 없다는 점, 그리고 심볼의 해결이 실행 시에 (동적으로) 실시되므로 프로그램 실행 시의 오버헤드가 있다는 점 등이 있다.

2. 2. 장점

동적 링킹은 일반적으로 컴파일 시점의 링킹보다 느리지만, 공간 효율성이 높다.[13] 정적 링킹에서는 실행 중인 모든 프로세스가 호출되는 라이브러리 함수 자체 복사본과 연결된다. 따라서 여러 프로그램에서 동일한 라이브러리를 여러 번 호출하는 경우 해당 라이브러리의 동일한 함수가 시스템 메모리의 여러 위치에 중복된다. 반면, 공유 동적 라이브러리를 사용하면 라이브러리의 복사본이 한 번만 메모리에 저장되므로 메모리 공간을 절약할 수 있다.[13] 또한 동적 링킹에서는 실제로 사용되는 경우에만 라이브러리가 로드된다.[14]

동적 링킹의 장점은 다음과 같다.

  • 코드 및 데이터 중복 감소로 모듈 크기 축소
  • 라이브러리 인터페이스 변경이 없는 경우, 라이브러리 업데이트 시 프로그램 재링크 불필요[15]

2. 3. 단점

동적 링킹은 일반적으로 컴파일 시점의 링킹보다 느리다. 이는 런타임에 실행되는 대부분의 프로세스에서 나타나는 현상이다.[12] 심볼 해결이 실행 시간에 동적으로 이루어지기 때문에 프로그램 실행 시 오버헤드가 발생한다.

또한, 모듈 자체에 필요한 모든 코드가 포함되어 있지 않아 자기 완결성이 떨어진다는 단점이 있다. 이로 인해, "DLL 지옥"과 같은 의존성 및 버전 관리 문제가 발생할 수 있다. 특히, 필요한 모듈이 시스템에 없거나 모듈 내에서 심볼을 찾을 수 없는 경우 프로세스 시작에 실패할 수 있다.

보안 취약점도 문제점으로 지적된다. 악의적인 DLL 파일로 인해 시스템이 위험에 노출될 수 있다는 것이다. (이는 보수 진영에서 제기하는 주요 문제점 중 하나이다.)

2. 4. 조기 결합과 지연 결합

동적 링킹은 프로그램 실행 시작 시 로더에 의해 처음으로 다른 모듈과 결합하는 방식을 말한다. 일반적으로는 애플리케이션 시작 시 로더에 의해 자동으로 심볼을 해결하는 조기 결합(얼리 바인딩)이 이루어진다. 필요한 모듈이 시스템 상에 존재하지 않거나, 모듈 내에 심볼이 발견되지 않는 경우에는 프로세스 시작에 실패한다.[15] 그러나 최소한 필요한 코드만을 본체에 포함시키고, 그 외의 코드는 다른 모듈로 분리하여, 사용자가 특정 기능을 사용하려 할 때 필요에 따라 모듈을 동적으로 로드하고, 심볼을 해결하는 지연 결합(레이트 바인딩)을 지원하는 환경도 있다.

2. 5. 공유 라이브러리

동적 링크 라이브러리(다이내믹 링크 라이브러리)는 여러 프로그램에서 공유되어 장점을 가지므로, "공유 라이브러리"로 운영되기도 한다.[15] 공유 라이브러리는 단독 애플리케이션뿐만 아니라 여러 애플리케이션에서 사용될 수 있다.

하지만 공유 라이브러리는 특정 버전의 내부 처리 및 사양에 의존하는 프로그램이 라이브러리 버전 업으로 인해 동작하지 않거나, 버전 업된 공유 라이브러리에 버그가 있으면 해당 라이브러리를 사용하는 모든 소프트웨어에 영향을 미치는 문제가 발생할 수 있다. 특히 라이브러리가 시스템 전체에서 공유될 때 문제가 심각해진다. 또한 버전 업에 따른 영향 범위를 미리 특정하기 어렵고, 동일한 공유 라이브러리의 여러 버전이 시스템 내에 존재할 때 탐색 우선순위 차이로 인해 동작이 달라지는 문제점도 있다. 이러한 단점은 컴퓨터 업계에서 "DLL 지옥"(DLL Hell)이라고 불리기도 한다.

2. 6. 플러그인

동적 로드, 동적 링크, 동적 바인딩(동적 바인딩) 메커니즘을 응용하여, 서드파티 개발자나 최종 사용자가 애플리케이션의 기능을 확장할 수 있도록 하는 것이 플러그인 메커니즘이다. 이름, 반환값, 인자, 호출 규약 등 플러그인의 인터페이스 사양에 따라 구현되고, 모듈 외부에 공개(익스포트)된 서브루틴이기만 하면 무엇이든 애플리케이션에서 탐색하여 콜백 함수로 호출할 수 있다는 덕 타이핑에 의한 다형성을 실현한다. 동적 로드를 지원하기 위한 하위 레벨 API로, Windows에서는 주로 `LoadLibrary()`와 `GetProcAddress()`[16]가, POSIX 환경에서는 `dlopen()`과 `dlsym()`[17]이 준비되어 있다.

3. 운영체제별 구현

유닉스 계열 시스템, 마이크로소프트 윈도우, macOS 등 다양한 운영체제에서 동적 링킹을 지원한다. 구현 방식에는 차이가 있는데, 각 운영체제의 특징은 다음과 같다.


  • 마이크로소프트 윈도우: 동적 링크 라이브러리(DLL)라는 공유 라이브러리 개념을 사용한다. 이러한 라이브러리는 `.DLL`, `.OCX`, `.DRV` 등의 파일 확장자를 가진다.[1]
  • 유닉스 계열 시스템 (ELF 사용): 실행 및 링크 가능 형식(ELF)을 사용하는 시스템 (솔라리스, HP-UX, 리눅스, FreeBSD 등)에서는 동적 링커의 경로가 실행 파일의 `.interp` 섹션에 내장된다. 공유 라이브러리는 `.so` 확장자를 가진다.[2][3][4][5][6]
  • macOS 및 iOS: Darwin 운영체제를 기반으로 하며, 동적 링커 경로는 실행 이미지의 Mach-O 로드 명령에 포함된다. 공유 라이브러리는 `.dylib` 확장자를 가지거나 프레임워크의 번들 내부에 배치된다.[10]
  • XCOFF 기반 유닉스 계열 시스템 (AIX): 공유 라이브러리는 `.a` 확장자를 사용한다.[1]
  • 기타 운영체제: OS/360과 같은 시스템에서는 LINK 매크로 명령을 사용하여 동적 링킹을 수행한다. Multics 운영 체제에서는 모든 파일이 세그먼트이며, 동적 링킹이 일반적인 작동 방식이다.[1]

3. 1. Microsoft Windows

마이크로소프트마이크로소프트 윈도우OS/2 운영 체제에서 구현한 공유 라이브러리 개념은 동적 링크 라이브러리(DLL)이다. 이러한 라이브러리는 일반적으로 `DLL`, `OCX` (ActiveX 컨트롤을 포함하는 라이브러리), `DRV` (레거시 장치 드라이버) 파일 확장자를 갖는다.[1] DLL의 파일 형식은 Windows EXE 파일과 동일하다. 즉, 32비트64비트 Windows의 PE (Portable Executable) 및 16비트 Windows의 NE (New Executable)이다.[1] EXE와 마찬가지로 DLL은 조합에 관계없이 코드, 데이터 및 리소스를 포함할 수 있다.[1]

DLL과 동일한 파일 형식을 갖지만 다른 파일 확장자를 가지며 리소스 섹션만 포함할 수 있는 컴퓨터 파일 데이터는 리소스 DLL이라고 할 수 있다.[1] 이러한 DLL의 예로는 확장자가 `MUI`인 다국어 사용자 인터페이스 라이브러리, 확장자가 `ICL`인 아이콘 라이브러리, 확장자가 `FON` 및 `FOT`인 글꼴 파일이 있다.[1]

3. 2. Unix-like 시스템 (ELF 사용)

대부분의 유닉스 계열 시스템에서 동적 링커는 운영체제 커널이 `exec` 또는 `posix_spawn` 함수를 호출한 결과로 새로 구성된 프로세스 주소 공간에서 먼저 로드하고 실행하는 외부 실행 파일이다. 링크 시점에 사용해야 하는 동적 링커의 경로는 실행 이미지에 포함된다.

실행 파일을 로드하면 운영 체제 커널은 실행 파일에서 동적 링커의 경로를 읽은 다음 이 다른 실행 바이너리를 로드하고 실행하려고 시도한다. 해당 경로에 파일이 없어서 시도가 실패하면 원래 실행 파일을 실행하려는 시도가 실패한다. 그런 다음 동적 링커는 초기 실행 이미지와 종속된 모든 동적으로 연결된 라이브러리를 로드하고 실행을 시작한다. 결과적으로 동적 링커의 경로는 운영 체제의 응용 프로그램 이진 인터페이스의 일부가 된다.

ELF를 사용하는 유닉스 계열 시스템 (솔라리스, 64비트 버전의 HP-UX, 리눅스, FreeBSD, NetBSD, OpenBSD, DragonFly BSD 등)에서 사용해야 하는 동적 링커의 경로는 링크 시점에 실행 파일의 `PT_INTERP` 세그먼트의 `.interp` 섹션에 내장된다. 이러한 시스템에서 동적으로 로드된 공유 라이브러리는 파일 이름 접미사 `.so` (공유 객체)로 식별할 수 있다.

동적 링커는 프로그램 실행 또는 프로그램 링크 중에 동작을 수정하도록 영향을 받을 수 있다.[2][3][4][5][6] 이러한 동작의 전형적인 수정 예는 `LD_LIBRARY_PATH` 및 `LD_PRELOAD` 환경 변수의 사용인데, 이는 공유 라이브러리를 다른 위치에서 검색하고, 그렇지 않으면 강제로 로드 및 링크하는 방식으로 런타임 링크 프로세스를 조정한다. 예를 들어 zlibc,[7]는 `uncompress.so`라고도 알려져 있으며, zlib compression library|zlib 압축 라이브러리영어와 혼동하지 않도록 주의해야 한다. `LD_PRELOAD` 해킹을 통해 사용할 때 투명한 압축 해제를 용이하게 한다. 결과적으로, 사용자는 파일이 압축되지 않은 것처럼 BSD 및 리눅스 시스템에서 미리 압축된 (gzipped) 파일 데이터를 읽을 수 있으며, 본질적으로 사용자가 기본 파일 시스템에 투명한 압축을 추가할 수 있지만 몇 가지 주의사항이 있다. 이 메커니즘은 유연하며, 파일 읽기 중에 해당 데이터가 요청한 사용자 프로세스에 제공되기 전에 동일한 코드를 쉽게 적용하여 추가 또는 대체 데이터 처리를 수행할 수 있다.[8][9]

3. 3. macOS 및 iOS

애플의 Darwin 운영체제와 이를 기반으로 하는 macOS 및 iOS 운영체제에서 사용해야 하는 동적 링커의 경로는 실행 이미지의 Mach-O 로드 명령 중 하나에 링크 시점에 임베딩된다. 이러한 시스템에서 동적으로 로드된 공유 라이브러리는 파일 이름 접미사 .dylib 또는 프레임워크의 번들 내부에 배치하여 식별할 수 있다.[10]

동적 링커는 일부 동작을 수정하도록 강제할 수 있다. 그러나 다른 유닉스 계열 운영체제와 달리 이러한 수정 사항은 동적 링커에서 무시될 수 있는 (경우에 따라 무시되는) 힌트이다. 이러한 동작의 일반적인 수정은 `DYLD_FRAMEWORK_PATH` 및 `DYLD_PRINT_LIBRARIES` 환경 변수를 사용하는 것이다. `DYLD_FRAMEWORK_PATH` 변수는 공유 라이브러리에 대한 실행 파일의 검색 경로를 조정하고, `DYLD_PRINT_LIBRARIES` 변수는 로드 및 링크될 때 라이브러리의 이름을 표시한다.[10]

애플의 macOS 동적 링커는 Darwin의 일부로 출시된 오픈 소스 프로젝트이며, 애플의 오픈 소스 `dyld` 프로젝트에서 찾을 수 있다.[11]

3. 4. XCOFF 기반 Unix-like 시스템 (AIX)

AIX와 같은 XCOFF를 사용하는 유닉스 계열 운영체제에서 동적으로 로드되는 공유 라이브러리는 파일 이름 접미사 `.a`를 사용한다.[1] 동적 링커는 프로그램 실행 또는 프로그램 링크 중에 동작을 수정하도록 영향을 받을 수 있다.[1] 이 동작의 전형적인 수정은 `LIBPATH` 환경 변수의 사용이다.[1] 이 변수는 공유 라이브러리를 다른 위치에서 검색하고, 그렇지 않으면 로드되지 않을 라이브러리를 강제로 로드하고 링크하여 런타임 링크 프로세스를 조정한다.[1]

3. 5. 기타 운영체제

OS/360 및 후속 시스템에서 어셈블러 언어 프로그램의 동적 링킹은 일반적으로 프로그램에 링킹될 라이브러리 모듈을 사용할 수 있도록 하는 운영 체제 루틴을 활성화하는 슈퍼바이저 호출 명령을 포함하는 LINK 매크로 명령을 사용하여 수행된다. 라이브러리 모듈은 제어 카드에 지정되어 프로그램의 특정 실행에서만 사용할 수 있는 "STEPLIB" 또는 "JOBLIB"에 있거나, 시스템 시작 시 지정된 PARMLIB의 LINKLIST에 포함된 라이브러리에 있거나, 시스템 시작 시 특정 재진입 모듈이 로드되는 "링크 팩 영역"에 있을 수 있다.

Multics 운영 체제에서 실행 파일을 포함한 모든 파일은 세그먼트이다.[1] 현재 세그먼트에 속하지 않은 루틴을 호출하면 시스템은 참조된 세그먼트를 메모리 또는 디스크에서 찾아 실행 중인 프로세스의 주소 공간에 추가한다.[1] 동적 링킹이 일반적인 작동 방식이며, 정적 링킹(''바인더'' 사용)은 예외이다.[1]

4. 하이퍼텍스트에서의 동적 링킹

하이퍼텍스트 기술에서 노드 간 링크를 미리 정의하는 방식과 대비되는 방식으로, 참조 시점에 동적으로 링크를 결정하는 방식을 말한다.

5. 효율성

동적 링킹은 일반적으로 컴파일 시점의 링킹보다 느리다. 더 많은 CPU 사이클이 필요하기 때문이다.[12] 이는 런타임에 실행되는 대부분의 프로세스에서 나타나는 현상이다. 하지만 동적 링킹은 공간 효율성이 좋다. 디스크 및 런타임 메모리에서 이점을 가진다. 라이브러리가 정적으로 링크되면 실행 중인 모든 프로세스는 호출되는 라이브러리 함수 자체 복사본과 연결된다. 따라서 여러 프로그램에서 동일한 라이브러리를 여러 번 호출하는 경우 해당 라이브러리의 동일한 함수가 시스템 메모리의 여러 위치에 중복된다. 공유 동적 라이브러리를 사용하면 컴파일 시간에 각 파일을 자체 라이브러리 복사본에 연결하여 잠재적으로 메모리 공간을 낭비하는 대신, 라이브러리의 복사본이 한 번에 하나만 메모리에 저장되므로 다른 곳에서 사용할 수 있는 메모리 공간이 확보된다.[13] 또한 동적 링킹에서는 실제로 사용되는 경우에만 라이브러리가 로드된다.[14]

참조

[1] 웹사이트 Creating a Resource-Only DLL http://msdn.microsof[...]
[2] 문서 ld.so.1 Solaris
[3] 문서 ld-linux.so Linux
[4] 문서 rtld FreeBSD
[5] 문서 ld.elf_so NetBSD
[6] 문서 ld.so OpenBSD
[7] 웹사이트 ZLIBC - Transparent access to compressed files https://www.zlibc.li[...]
[8] 웹사이트 uncompress.so http://www.delorie.c[...] 2014-07-04
[9] 웹사이트 zlibc.conf http://www.delorie.c[...] delorie.com 2014-07-04
[10] 문서 dyld Darwin
[11] 웹사이트 Open Source - Releases https://opensource.a[...] apple.com 2014-07-04
[12] 웹사이트 Operating Systems Principles: Linking and Loading https://www.csc2.ncs[...] North Carolina State University 2020-09-24
[13] 웹사이트 Anatomy of Linux dynamic libraries https://developer.ib[...] IBM 2008-08-28
[14] 웹사이트 Dynamic Linking and Loading http://web.cse.ohio-[...] Ohio State University 2012-08
[15] 웹사이트 Advantages of Dynamic Linking - Win32 apps https://learn.micros[...] Microsoft Learn
[16] 웹사이트 GetProcAddress function (libloaderapi.h) - Win32 apps https://learn.micros[...] Microsoft Learn
[17] 웹사이트 dlsym - get the address of a symbol from a symbol table handle https://pubs.opengro[...] The Open Group Base Specifications Issue 7, 2018 edition / IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008)



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com