다음 질문은 관련이 있지만, 내 질문에 대답하지 않습니다 Static link of shared library function in gcclibc 정적 라이브러리와 다른 라이브러리를 동적으로 링크하는 GCC?
Linking partially static and partially dynamic in GCC
Linking a dynamic library to a static library that links to other static libraries
GCC: static linking only some libraries
내가 이전 매우 비슷한 질문을, 그러나 이전 이후 나에 의해 시작된 질문은 코멘트 섹션에서 다소 복잡해졌으며 완전히 답변되지 않았습니다. (그러나 나는 노력으로 좋았고 적어도 부분적으로 대답했기 때문에 답을 냈다.) 나는 새로운 질문을 할 것이다. 문제는 libc를 정적으로 연결하는 방법과 다른 라이브러리 (예 : libm)를 동적으로 링크하는 방법입니다. 이것은 첫 번째 질문에서 할 수없는 제안이었습니다. 사실입니까? 그렇다면 이유를 아는 것이 매우 흥미로울 것입니다.
이 작업을 수행 할 수 있습니까? 어떤 사람이 주석을 달았습니다 (어떤 이유로 제거되었거나 틀렸을 수도 있습니다). 가능한 한 그렇지만 도이 동적 라이브러리에 필요하기 때문에 libc의 동적 링크 버전이 존재해야합니다 (예 : 동적 libm에는 동적 libc (?)가 필요합니다.
이것은 괜찮습니다. GCC에게 정적 또는 동적으로 libc의 링크를 지정하는 방법을 알지 못합니다. 나는 이것을 어떻게 하는가? (나는 몇 가지 시도를했고, 어떤 것은 질문의 뒷부분에 표시되어있다)? 아니면 내가 원하는 것을 할 수있는 다른 방법이 있습니까?
다음과 같이 우리는 첫째, 단순히 GCC TEST.C의 -lm을 실행하여, 모든 동적으로 연결되어 있음을 볼 수 : 동적 남아 libc의 허용하면서
$ gcc test.c -lm
$ ldd a.out
linux-vdso.so.1 (0x00007fffb37d1000)
libm.so.6 => /lib64/libm.so.6 (0x00007f3b0eeb6000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3b0eb10000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3b0f1b0000)
는 만 libm의 정적 연결하려면 우리가 할 수있는 할 (Z 보손으로 상기 질문 중 하나 지적) :
$ gcc test.c /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libm.a
$ ldd a.out
linux-vdso.so.1 (0x00007fff747ff000)
libc.so.6 => /lib64/libc.so.6 (0x00007f09aaa0c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f09aadb2000)
그러나 동일한 절차를 시도하는 정적 libc의 연결 및 동적 libm의 수, 작동하지 않는 것 :
$ gcc test.c /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libc.a -lm
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../x86_64-pc-linux-gnu/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie
collect2: error: ld returned 1 exit status
이 오류 메시지는 무엇을 의미합니까?
몇 가지 다른 시도 (대부분이 또한 내 첫 번째 질문에 포함 된) : 컴파일 된 마지막 하나는/성공적으로 연결된 것을
$ gcc test.c /usr/lib64/libc.a
linux-gnu/4.7.3/../../../../x86_64-pc-linux-gnu/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib64/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie
urned 1 exit status
$ gcc test.c -Wl,-Bdynamic -lm -Wl,-Bstatic -lc
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgcc_s
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
$ gcc -Wl,-Bdynamic -lm -Wl,-Bstatic -lc test.c
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgcc_s
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
$ gcc -Wl,-Bstatic -lc -Wl,-Bdynamic -lm test.c
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../x86_64-pc-linux-gnu/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie
collect2: error: ld returned 1 exit status
$ gcc test.c /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libc.a /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libc.so -lm
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../x86_64-pc-linux-gnu/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie
collect2: error: ld returned 1 exit status
$ gcc test.c /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libc.so /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libc.a -lm
참고. 그러나 libc는 정적으로 링크되지 않았으며, 동적으로 링크되어 있지 않으므로 또 다른 실패한 시도입니다.
테스트 프로그램 단순히 다음
$ cat test.c
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv)
{
int i;
int result;
for(i = 0; i < 65535; i++) {
result = sin(i);
}
return 0;
}
편집 :
Static link of shared library function in gcc
어느 :이 질문에 제안 나는 또한, statifier과 순백을 시도했습니다
공장.
해결하려는 문제는 무엇입니까? 더 높은 수준에서 말입니다. "정적으로 링크하고 싶습니다." 아마도 우리는 그 문제를 해결할 수 있습니다. –
'libm'은'libc'에 링크합니다 - 문제의 일부일 수도 있습니다 ('ldd/usr/lib64/libm.so'를보십시오). –
@ 존 Zwinck, 그것은 사소한 일이 아니지만, 일부 특수한 상황에서 인텔 MPX에 대해 ROP 기반 익스플로잇이 가능하다는 것을 보여주고 싶지만, libmpx (동적 링크 형식으로 존재하며 소스 코드가 없습니다 , 내가 아는 한) 동적으로 링크되고 libc는 정적으로 링크됩니다. 그러나 이것이 가능하지 않다면 어떤 이유에서인지를 아는 것이 흥미로울 것이고 나는 다른 접근법을 찾아 볼 것입니다. – AttributedTensorField