Eine gemeinsam genutzte Bibliothek von einem x86-64-Objekt aus Assembly kann aufgrund von PIC nicht verknüpft werden
Ich portiere eine gemeinsam genutzte Bibliothek von 32-Bit auf 64-Bit. Es besteht aus einer Assembly (geschrieben für NASM), die mehrere Prozeduren und ein bisschen übergeordneten C-Code exportiert. Ich baue auf einer 64-Bit-Debian-Maschine mit NASM 2.10.01 und GNU ld 2.22 auf.
Nachdem alle Push / Pop-Probleme behoben wurden (das Pushen von 32-Bit-Teilen von Registern wird im 64-Bit-Modus offensichtlich nicht funktionieren), muss ich das Objekt zusammenstellen, aber jetzt werde ich durch die Verknüpfungsphase angehalten. Hier sind meine Befehlszeilen - Assembly:
nasm -Ox -dPTC_ARCH=X64 -f elf64 particl.asm -o particlasm.o
Verlinkung:
ld -shared -lc -S -melf_x86_64 particlasm.o ptc_highlevel.o -o libparticlasm.so
(Der Schalter -lc erzwingt das Verknüpfen der Standard-C-Bibliothek in - Ich benötige einige seiner Funktionen im Assembler-Code.)
Der Linker schlägt jedoch mit der folgenden Meldung fehl:
ld: particlasm.o: relocation R_X86_64_32 against `.text' can not be used when making a shared object; recompile with -fPIC
particlasm.o: could not read symbols: Bad value`
Mir ist bekannt, warum PIC auf 64-Bit-Systemen erforderlich ist. Ich benutze in der Tat PIC, wie in Abschnitt 9.2 des Dokuments beschriebenNASM-Handbuch. Mir scheint jedoch, dass NASM meinen Code in der ELF-Symboltabelle nicht als PIC markiert, was den Linker zum Protest veranlasst, und ich kann keine verwandten Befehlszeilenschalter oder Anweisungen im Handbuch finden, um dies zu beheben.
Irgendwelche Ideen?