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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage