Chciałbym wiedzieć, jak działają programy, aby zrobić to jak okiełznane kości, jak to tylko możliwe.Dlaczego program złożenia działa tylko po połączeniu z crt1.o crti.o i crtn.o?
Właśnie dowiedziałem się, jak zainstalować kod dla x86_64 za pomocą funkcji wprintf (ustalono, że szerokie znaki są 32-bitowe). wszystko co musiałem zrobić to link do libc (-lc).
Próbuję złożyć kod dla 32-bitowego robiąc o tym samym rzecz, ale potknąłem się całkiem sporo. Ostatecznie użyłem gcc do połączenia (i zmieniłem _start: na main :). Tak więc zrobiłem linkowanie za pomocą ld i zawarłem crt1.o crti.o i crtn.o. Wtedy mój program działał (nie wydrukował niczego wcześniej) Więc moje pytanie brzmi, czy mogę zrobić coś w moim kodzie, aby wyeliminować potrzebę tych 3 innych plików obiektów (i oczywiście powrócić do _start: zamiast głównej :) ?
test_lib.S
.section .data
locale:
.string ""
.align 4
printformat:
.long '%','l','c',0
.section .text
.global main
main:
pushl $locale
pushl $6
call setlocale
pushl $12414
pushl $printformat
call wprintf
pushl $2
call exit
i uruchamiając następujące
as --32 test_lib.S -o test_lib.o
ld -m elf_i386 -L/lib/ -L/usr/lib/ -I/lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o -lc /usr/lib/crtn.o test_lib.o -o test_lib
./test_lib
OH, a wyjście jest po prostu japoński hiragana (MA) ま (zawiadomienie nie ma przerwy w linii tak drukuje przed monitem)
http://stackoverflow.com/questions/3577922/how-to-link-a-gas-assembly-file-as-ac-program-with-ld-without-using-gcc –