DLADDR(3)

명칭
dladdr - 지정의 주소가 포함되는 공유 오브젝트를 검출한다

프로그램 라이브러리
libc

서식
<dlfcn.h> int dladdr(const void *addr, Dl_info *info)

해설
dladdr (은)는, 주소 addr 하지만 포함되는 공유 오브젝트에 관한 정보에 대해 동적 링커를 조회합니다. 정보는, info 에 의해 지정되는 구조 체내에 돌려주어집니다. 이 구조체에는 적어도 다음의 멤버가 포함됩니다.

const char *dli_fname
    지정한 주소가 포함되는 공유 오브젝트의 패스명.

void *dli_fbase
    공유 오브젝트가 호출해 원프로세스의 address 공간에 MAP 되는 베이스 주소.

const char *dli_sname
    addr 이하의 값을 가진 가장 가까운 런타임 심볼의 이름. 가능한 때는, 심볼명이 C 원시 코드로 표시되도록(듯이) 돌려주어집니다.

    적절한 값의 심볼이 발견되지 않는 경우는, 이 필드와 dli_saddr 의 양쪽 모두가 NULL (으)로 설정됩니다.

void *dli_saddr
    dli_sname 그리고 돌려주어진 심볼의 값.

dladdr (은)는 동적으로 링크 되는 프로그램으로만 이용할 수 있습니다.

에러
addr 하지만 포함되어 있는 MAP 된 공유 오브젝트가 발견되지 않는 경우, dladdr 하 0 을 돌려줍니다. 이 경우, 실패 이유를 자세하게 말한 메세지를 dlerror() (을)를 호출하는 것으로 꺼낼 수가 있습니다.

성공시에는, 0 이 아닌 값이 돌려주어집니다.

관련 항목
rtld(1), dlopen(3)

역사
dladdr 함수는 Solaris operating system로 처음 등장했습니다.

버그
이 함수는, Solaris 에서의 실장과 버그에 호환성이 있습니다. 특히, 다음의 버그가 존재합니다.

•   addr 하지만 공유 프로그램 라이브러리는 아니고 메인의 실행 가능 모듈에 있는 경우, dli_fname 그리고 돌려주어지는 패스명은 올바른 것이 되지 않을 가능성이 있습니다. 패스명은 호출해 프로세스의 argv[0] (으)로부터 직접 꺼내집니다. 풀 패스명으로 지정된 프로그램 (을)를 실행할 때, 대부분의 쉘은 argv[0] (을)를 패스명으로 설정합니다. 그러나, 이것은 쉘의 필요 조건이 아니고, operating system에 의해 프로텍션되어도 있지 않습니다.

•   addr 하지만 형식 &func ( func (은)는 글로벌 함수)인 경우, 그 값이 바람직하지 않은 놀라는 것이 되어 버린다 가능성이 있습니다. 동적 링크 된 프로그램에서는, 글로벌 함수의 주소는 함수 그 자체의 엔트리 포인트가 아니고, 프로그램 링크 테이블의 엔트리를 가리킨다고 생각됩니다. 이 때문에, 대부분의 글로벌 함수가, 실제의 코드가 들어가 있다 공유 프로그램 라이브러리가 아니고, 메인의 실행 가능 모듈 내부에서 정의되고 있는 것처럼 보입니다.

•   처리의 실패를 나타내는 것으로서 0 을 돌려주는 것은, 길게 계속되고 있다 Unix 의 전통에 반하는 것입니다.