Jestem zadowolonym użytkownikiem Debiana w wersji AMD64, zaczynam naukę assemblera. Mam następującą sytuację: uczę się asma w wersji 32-bitowej (bądź co bądź systemy 32bitowe są na razie bardziej popularne niż 64bitowe), ale używam systemu 64-bitowego. Kompilacja nasmem nie protestuje, ale linker (ld) wyświetla:
ld: i386 architecture of input file `hello.o' is incompatible with i386:x86-64 output
Mam następujące zapytania:
Genezą problemu jest 64-bitowe jądro czy chodzi raczej o wersję linkera? Jeśli to sprawa linkera, to wystarczy chyba wpakować do systemu 32-bitową, prawda?
Czy jeśli uda się to linkować, to zadziała zarówno na systemie 64bitowym jak i 32bitowym?
Czy są powody, dla których powinienem się jednak uczyć wersji 64-bitowej asma?
Ja programowałem w GNU asemblerze i znane mi rozwiązania tego problemu są następujące:
1. Kompilujesz programy za pomocą gcc i flagi -m32 (musisz doinstalować dodatkowe 32 bitowe biblioteki)
2. Na virtualboksie instalujesz sobie system 32 bitowy.
Nie wiem czy pierwsze rozwiązanie ma zastosowanie w przypadku NASMA (raczej nie ).
Skoro dopiero zaczynasz się uczyć zalecałbym naukę asemblera 64 bitowego - trzeba iść z trendami, poza tym w końcu wszystkie aplikacje będą 64 bitowe. Dodatkowo trochę łatwiej pisze się programy - mniej zabawy ze stosem, dodatkowe rejestry itd. Jeżeli masz wybór to polecałbym właśnie GNU assemblera zamiast NASMA - za pomocą gcc i flagi -S możesz generować np. z programów w C kod źródłowy w asemblerze (GNU) i w ten sposób można bardzo szybko się uczyć. GDB również z niego korzysta.
Generalnie jestem znacznie bardziej przekonany do nasma, ale przyjrzę się bliżej temu GNU Co do Twojego punktu drugiego - myślę, że mniej cudowania jest ze zrobieniem debootstrapu.
Z tego co pamiętam to Debian jest wielo-bibliotekowy. Niestety nie podpowiem Ci jaka jest nazwa pakietu, ale w Archu zainstalowałem binutils-multilib i ld wspiera również linkowanie 32-bitowych elfów tak: