Folgende Fragen sind relevant, beantworten aber nicht meine Frage:
Verlinkung teilweise statisch und teilweise dynamisch in GCC
Verknüpfen einer dynamischen Bibliothek mit einer statischen Bibliothek, die mit anderen statischen Bibliotheken verknüpft ist
GCC: Statisches Linken nur einiger Bibliotheken
Statischer Link der gemeinsam genutzten Bibliotheksfunktion in gcc
Ich habe vorhin eine sehr ähnliche Frage gestellt, aber da die vorherige Frage, die von mir gestartet wurde, im Kommentarbereich etwas überladen und nicht vollständig beantwortet wurde (aber ich habe sie als beantwortet markiert, da es eine gute Anstrengung war und sie zumindest teilweise beantwortet hat), werde ich es tun eine neue Frage stellen. Die Frage ist speziell, wie man libc statisch verlinkt, während man andere Bibliotheken (zB libm) dynamisch verlinkt. Dies wurde in der ersten Frage vorgeschlagen, was nicht möglich ist, ist das wahr? Wenn ja, wäre es sehr interessant zu wissen, warum nicht.
Ist es überhaupt möglich, dies zu tun? Jemand hat einen Kommentar gemacht (der aus irgendeinem Grund entfernt wurde, vielleicht war er falsch?), dass es möglich ist, aber es muss dann Auch existiert eine dynamisch gelinkte Version von libc, da sie von der dynamischen Bibliothek benötigt wird (z. B. dynamische libm erfordert dynamische libc (?)).
Das ist in Ordnung für mich, aber es ist mir nicht klar, wie ich GCC anweisen soll, dies zu tun, dh in libc sowohl statisch als auch dynamisch zu verknüpfen. Wie mache ich das (ich habe ein paar Versuche unternommen, einige werden später in der Frage gezeigt)? Oder gibt es eine andere Möglichkeit, das zu tun, was ich will?
Wir sehen zunächst, dass durch einfaches Ausführen von gcc test.c -lm alles wie folgt dynamisch eingebunden wird:
$ 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)
Um nur libm als statisch zu verknüpfen, während libc dynamisch bleibt, können wir Folgendes tun (wie Z-Boson in einer der oben genannten Fragen betonte):
$ 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)
Der Versuch, mit demselben Verfahren libc static und libm dynamic zu verknüpfen, scheint jedoch nicht zu funktionieren:
$ 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
Was bedeutet diese Fehlermeldung?
Einige andere Versuche (die meisten waren auch in meiner ersten Frage enthalten):
$ 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
Beachten Sie, dass der letzte erfolgreich kompiliert/verknüpft wurde. Allerdings wurde libc nicht statisch eingebunden, sondern nur dynamisch, also ist es ein weiterer fehlgeschlagener Versuch.
Das Testprogramm ist einfach das folgende:
$ 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;
}
Bearbeiten:
Ich habe auch Statifier und Hermelin ausprobiert, wie in dieser Frage vorgeschlagen:
Statischer Link der gemeinsam genutzten Bibliotheksfunktion in gcc
Beides funktioniert nicht.
Was ist das Problem, das Sie zu lösen versuchen? Ich meine auf einer höheren Ebene, nicht “Ich möchte statisch verlinken”. Vielleicht können wir das Problem lösen.
– Johannes Zwinck
9. Oktober 2014 um 11:56 Uhr
libm
Links zulibc
– das kann Teil des Problems sein (sieheldd /usr/lib64/libm.so
).– el.pescado – нет войне
9. Oktober 2014 um 12:13 Uhr
@John Zwinck, es ist nicht trivial, ich versuche zu zeigen, dass ein ROP-basierter Exploit unter bestimmten Umständen gegen Intel MPX möglich ist, aber es erfordert, dass libmpx (das nur in dynamisch verknüpfter Form existiert, kein Quellcode verfügbar ist, soweit ich weiß) wird dynamisch eingebunden und libc wird statisch eingebunden. Wenn dies jedoch nicht möglich ist, wäre es auf jeden Fall interessant zu wissen, warum nicht, und ich würde nach einem anderen Ansatz suchen.
– Zugeschriebenes TensorField
9. Oktober 2014 um 12:58 Uhr
@el.pescado, ja, das ist höchstwahrscheinlich zumindest ein Teil des Problems, es wurde kurz im Kommentarbereich darauf hingewiesen, bevor der Kommentar in der anderen Frage verschwand.
– Zugeschriebenes TensorField
9. Oktober 2014 um 12:59 Uhr
Benötigen Sie die ganz von libc statisch gelinkt, oder nur ein paar spezifische Funktionen?
– ams
9. Oktober 2014 um 14:06 Uhr