as Kompilieren mit -static-libgcc -static-libstdc ++ führt immer noch zu einer dynamischen Abhängigkeit von libc.

Ich versuche eine ausführbare Datei zu erstellen, die so portabel wie möglich ist. Nachdem ich einige Abhängigkeiten entfernt hatte, stieß ich beim Ausführen der Binärdatei auf einem anderen System auf Folgendes:

/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by foob)

Ich würde es vorziehen, wenn meine Binärdatei den Benutzer nicht dazu auffordert, seine Version von @ zu aktualisiere libc, daher möchte ich diese Abhängigkeit auch entfernen.

Die Linker-Flags, die die obige Binärdatei erzeugt haben, sind bereits enthalten-static-libgcc -static-libstdc++. Wie kommt es, dass die Binärdatei noch auf dem gemeinsam genutzten @ benöti libc.so.6?

Ich habe versucht, das @ hinzuzufüg-static flag auch, aber wenn ich versuche, @ auszuführDa binär das Ergebnis ist sehr seltsam:

$ ls -l foob
-rwxr-xr-x 1 claudiu claudiu 13278191 Oct 10 13:03 foob
$ ./foob
bash: ./foob: No such file or directory

Was ist zu tun

BEARBEITEN

$ file foob
foob: ELF 64-bit LSB  executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=5adee9a598b9261a29f1c7b0ffdadcfc72197cd7, not stripped
$ strace -f ./foob
execve("./foob", ["./foob"], [/* 64 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1)                           = ?
+++ exited with 1 +++

Interessanterweise, wenn ichldd die Versionohn -static, es hat zweiwenige Einträge als die Version mit-static, nämlich:

libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4f420c1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4f41636000)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage