Ich brauche C-Programm auf einem gemeinsam genutzten Objekt ohne Abschnittsüberschriften zu verknüpfen

StackOverflow https://stackoverflow.com/questions/2127638

Frage

Ich habe eine Schnittstelle mit dem Codegenerator geschrieben, die ich gemeinsam genutzte Objekte kann erzeugen. Obwohl ich keine Unterstützung o will implementieren für Abschnitt Kopftabelle, weil dort die Mehrheit Komplexität der ELF-Dateiformat bleibt in.

GNU ld verwendet Abschnittsüberschriften für gegen gemeinsame Objekte zu verknüpfen. Dies bedeutet, dass wenn ich versuche, ohne Abschnittsüberschrift gcc Link gegen mein gemeinsames Objekt zu setzen, wird es scheitern, weil die ld auch nicht die Symbole finden, wenn sie in der Bibliothek vorhanden ist.

Hat es einige Trick existieren könnte ich verwenden Sie den Compiler zu täuschen, um die Verknüpfung selbst zu machen gelingen, wenn sie nicht bestimmte Symbole finden würde?

Hier einige Klärung der Probleme:

cheery@ruttunen:~/Documents/g386$ gcc dev/shared_test.c -L. -lshared -m32
/tmp/cc6qBViY.o: In function `main':
shared_test.c:(.text+0xa): undefined reference to `example_function'
collect2: ld returned 1 exit status
cheery@ruttunen:~/Documents/g386$ cat dev/shared_test.c 
// gcc shared_test.c -L. -lshared -m32
// LD_LIBRARY_PATH=. ./a.out
#include <stdio.h>

extern int example_function();

int main(){
    printf("hello %d\n", example_function());
}
cheery@ruttunen:~/Documents/g386$ readelf -D -s libshared.so 

Symbol table for image:
  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name
    2   0: 00800164     0    FUNC GLOBAL DEFAULT ABS example_function
    1   0: 008000ac     0  OBJECT GLOBAL DEFAULT ABS _DYNAMIC
War es hilfreich?

Lösung 2

Der beste Ansatz ist hier die Abschnittstabellen von gcc erforderlich hinzuzufügen. Wenn Sie eine funktionierende dynamische Verbindungsmechanismus in Ihrem Generator haben, es erfordert, dass alle die gleichen Informationen wie das, was Sie in den Abschnitt Tabellen einfügen würde.

Für Faulheit schrieb ich eine freigegebene Assembly-Datei und gebrauchten streift Befehl ihm einen Bezugspunkt zu bekommen. 'readelf --sections' zeigt paar Abschnitte, aber Sie müssen sie nicht alle. Ich arbeitete durch diese und umgesetzt Abschnitte um, bis sie anfing zu arbeiten korrekt. Hier ist, was ich hatte hinzuzufügen:

cheery@ruttunen:~/Documents/g386$ readelf --sections dynamic_hello.app 
There are 5 section headers, starting at offset 0x1b9:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .shstrndx         STRTAB          00000000 000281 000024 00      0   0  1
  [ 2] .dynamic          DYNAMIC         00000000 0000b0 000050 08  WA  3   0  4
  [ 3] .dynstr           STRTAB          00000000 000158 000020 00   A  0   0  1
  [ 4] .dynsym           DYNSYM          00000000 000100 000040 10   A  3   0  4
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

Es tut nicht weh, wenn Sie in mehreren Abschnitten als diese setzen, aber das ist genug, um dynamische Verknüpfung zum Laufen zu bringen.

Andere Tipps

gcc (das heißt, ld hinter gcc) eine Kommandozeilen-Option nicht aufgelöste externe zu ignorieren. Das wird die Fehlermeldung, die Sie von gcc erhalten unterdrücken. Ich bin nicht sicher, dass das wird dich glücklich machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top