2017-06-09 3 views
1

verbunden werden kann. Mein System ist ein älteres NAS mit 2.6.32. Ich habe festgestellt, dass bei der Verwendung von -static für jede nachfolgende Bibliothek auch versucht wird, irgendeine andere Bibliothek, die ich brauche, statisch zu verknüpfen.Statische Verknüpfung einer Bibliothek bewirkt, dass die libc nicht mit

Wenn ich zuerst das Flag -Wl, -Bdynamic hinzufüge und dann diese Bibliotheken mit -lc explizit benenne, wie zum Beispiel "-Wl, -Bdynamic -lc -lstdC++", funktioniert es. Was passiert, ist, dass libc und andere nicht statisch verknüpft sind.

Die statische libc auf dem System /opt/lib/libc_nonshared.a. genannt

Der Inhalt /opt/lib/libc.so dies:

OUTPUT_FORMAT(elf32-littlearm) 
GROUP (/lib/libc.so.6 /opt/lib/libc_nonshared.a) 

Die gcc Version 4.2.3 ist. Der aktuelle Build-Befehl, dem ich gegenüberstehe, fügt -dynamic am Ende hinzu, aber das hilft nicht viel. Wenn ich eine statische Bibliothek direkt mit dem Namen .a hinzufüge und keine -l-Markierung verwende, gibt es kein Problem.

Das Problem scheint zu sein, dass die dynamische Bibliothek von libc kam mit dem NAS, aber die statische Version befindet sich in/opt/lib.

Ich betreibe:

gcc hamming.c -static -L. -L/opt/lib -l:matrix.a -o hamming 

ich:

/opt/lib/gcc/arm-none-linux-gnueabi/4.2.3/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lc 
collect2: ld returned 1 exit status 
make: *** [hamming] Error 1 

wenn ich versuche, statische libc zu verwenden, wie ist. Würde ich einen 'Hack' ausführen, um libc_nonshared.a mit libc.a zu verknüpfen, findet er es plötzlich. Aber beschwert sich:

hamming.c:54: undefined reference to `malloc' 
hamming.c:54: undefined reference to `memset' 

Und eine Zillion andere Fehler natürlich. Wie bereits erwähnt, enthält /opt/libc.so den Verweis auf beide Dateien (dynamisch und statisch).

Für libstdC++ existiert nur eine .la-Datei.

Antwort

1

Die -static Linker-Flag nimmt kein Argument. Es ist ein boolean Flag, das einfach den Linker leitet keine gemeinsam genutzten Bibliotheken zu verknüpfen, wie documented

-static

nicht gegen gemeinsam genutzte Bibliotheken verknüpfen Sie ...

Es gibt keine müssen den Linker explizit anweisen, freigegebene (dynamische) Bibliotheken zu verknüpfen, wenn es eine Auswahlmöglichkeit hat, da dies der Standardbevoiour ist. Wenn Sie einfach verknüpfen, z.

gcc -o prog ... -lfoo ... 

dann der Linker wird die erste von libfoo.so (gemeinsam) oder libfoo.a (statisch) verknüpfen, dass es in einer der angegebenen (-Ldir) oder Standard Suchverzeichnisse findet, durchsucht in Commandline-Sequenz. Wenn es sowohl libfoo.so als auch libfoo.a im selben Verzeichnis findet, wählt es libfoo.so. Auf diese Weise können gemeinsam genutzte und statische Bibliotheken ohne spezielle Optionen frei gemischt werden .

Geben Sie -static nur an, wenn Sie eine Verknüpfung wünschen nur statische Bibliotheken.

Wenn Sie auf die Verknüpfung eines bestimmten libfoo.a sogar darauf bestehen wollen, wenn libfoo.so im selben Verzeichnis und würde standardmäßig ausgewählt werden, verwenden die explizite Form der -l Option: -l:libfoo.a

Später

gcc hamming.c -static -L. -L/opt/lib -l:matrix.a -o hamming 

versagt Dieser Befehl mit:

ld: cannot find -lc 

, da die Linker (ld) jede der angegebenen Linker Suchverzeichnisse (-L. -L/opt/lib) oder die Standard-Linker Suchverzeichnisse eine statische Bibliothek libc.a in nicht finden kann. Wenn Sie stattdessen wollen verknüpfen /opt/lib/libc_nonshared.a dann sollte Ihr Befehl sein:

>gcc hamming.c -static -L. -L/opt/lib -l:matrix.a -lc_nonshared -o hamming 

Sie haben jedoch nicht erklärt, warum Sie dieses Programm verknüpfen möchten statisch (-static) an erster Stelle, was nicht der übliche Weg ist, und erfordert, dass Sie statische Versionen von alle Bibliotheken für die Verknüpfung erforderlich - sowohl diese Sie explizit verknüpfen und die Standardbibliotheken, die gcc für C-Sprache Verknüpfung hinzufügen (Standard-C-Bibliothek, GCC-Laufzeitbibliothek) installiert haben.

Angenommen, Sie haben eine statische Bibliothek mit dem Namen (seltsam) matrix.a (eher als normalerweise, libmatrix.a), die in /some/dir/ befindet, dann den normalen Weg, um Ihr Programm zu kompilieren und zu verknüpfen wäre:

gcc hamming.c -L/some/dir -l:matrix.a -o hamming 

Ich schlage vor, Sie beginnen damit und weichen nur als Probleme Sie zu.

Die Entdeckung eines /opt/lib/libc.so enthält:

OUTPUT_FORMAT(elf32-littlearm) 
GROUP (/lib/libc.so.6 /opt/lib/libc_nonshared.a) 

wird Ihnen irreführend. Dies ist nicht Ihre gemeinsame libc. Eine gemeinsam genutzte Bibliothek ist eine Binärdatei. Dies ist ein Linker-Skript, und es heißt, dass Ihre gemeinsame libc tatsächlich /lib/libc.so.6 ist. Der Linker wird sie fast sicher finden und standardmäßig verwenden.

+0

Was könnte statische Verbindung von z.B. libc und libstd ++ um zu brechen? – Xennex81

+0

@ Xennex81 Es hängt davon ab, was Sie mit "Pause" meinen. Man kann nur darüber spekulieren, warum ein bestimmter Verbindungsbefehl fehlschlägt, ohne den fehlgeschlagenen Verbindungsbefehl und alle daraus folgenden Fehler zu sehen. Wenn Sie diese Information wörtlich hinzufügen, erhalten Sie im Körper Ihrer Frage wahrscheinlich genau die richtige Antwort. –

+0

Ich habe diese Informationen erhalten. – Xennex81

Verwandte Themen