공유 라이브러리 실행

공유 라이브러리 실행

일부 공유 라이브러리는 명령줄에서 호출할 때 마치 실행 파일인 것처럼 출력을 제공합니다. 예를 들어:

$ /lib/libc.so.6 
GNU C Library stable release version 2.13, by Roland McGrath et al.
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.5.2.
Compiled on a Linux 2.6.37 system on 2011-01-18.
[...]

C로 작성된 공유 라이브러리에 이 출력을 어떻게 제공할 수 있나요? 이제 방금 생성한 라이브러리를 구현했고 segment fault.

답변1

void __libc_main()또는 을 정의해 보십시오 void _init().

답변2

방금 기본적으로 같은 질문에 대답했습니다.스택 오버플로. 이 문제를 해결하려는 동기는 지원을 구현하는 것입니다.libcap그리고pam_cap.so.

답변의 주요 구성 요소는 다음과 같습니다: .interp동적 라이브러리 로더에 대한 참조를 포함하는 ELF 섹션 런타임 진입점 사양.

단계 (약어로스택 오버플로답) 이렇게 하세요.

  • 시스템에서 어떤 동적 로더가 사용되는지 확인하십시오.
$ ldd $(which awk)|grep ld-linux|awk '{print $1}'
/lib64/ld-linux-x86-64.so.2
  • 이 바이너리에 대한 참조를 포함하도록 공유 라이브러리 소스 코드를 빌드하고 SSE 관련 세그폴트( 라고 함 foo.c)를 방지하기 위해 강제 스택 정렬을 수행합니다.
#include <stdio.h>
#include <stdlib.h>

void multi(const char *caller) {
    printf("called from %s\n", caller);
}

__attribute__((force_align_arg_pointer))
void multi_main(void) {
    multi(__FILE__);
    exit(42);
}

const char dl_loader[] __attribute__((section(".interp"))) =
    "/lib64/ld-linux-x86-64.so.2";
  • 컴파일/링크 라이브러리 및 해당 라이브러리실행 가능정의된 진입점:
$ gcc -fPIC -shared -o foo.so foo.c --entry=multi_main
$ ldd foo.so 
    linux-vdso.so.1 (0x00007fff345d7000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f5bd69f6000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5bd6be9000)
$ file foo.so 
foo.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=94ffcc60e66b21021ad564882c8e39ebeccd477e, not stripped
$ ./foo.so 
called from foo.c

이것은 아주 사소한 예입니다. 이전 답변이나 링크된 제출에서 자세한 내용을 확인할 수 있습니다.libcap.

관련 정보