Jako ćwiczenie, aby dowiedzieć się dokładniej, jak działają programy c oraz jaki minimalny poziom zawartości musi istnieć, aby program mógł korzystać z biblioteki libc, zdecydowałem się na programowanie głównie w x86 przy użyciu gazu i ld .Jak połączyć program do montażu gazu, który korzysta ze standardowej biblioteki C z ld bez użycia gcc?
Jako zabawne, małe wyzwanie, udało mi się zebrać i połączyć kilka programów powiązanych z różnymi samodzielnie tworzonymi bibliotekami dynamicznymi, ale nie udało mi się zakodować programu od zera, aby korzystać z wywołań funkcji libc bez bezpośredniego korzystania z gcc .
Rozumiem konwencje wywoływania poszczególnych funkcji biblioteki c oraz dokładnie sprawdziłem programy skompilowane z gcc za pomocą obiektów objdump i readelf, ale nie dotarły nigdzie, o ile informacje zawierają się w pliku zespołu gazowego i jakie parametry wywołać w ld, aby pomyślnie połączyć z libc. Ktoś ma wgląd w to?
Używam systemu Linux na maszynie x86.
to bardzo pomocne, że wyjaśnia wiele informacji. po zastosowaniu tego do mojego kodu, otrzymuję 2 błędy, "niezdefiniowane odwołanie do" __libc_csu_fini "" i "niezdefiniowane odwołanie do" __libc_csu_init "" po wykonaniu zrzutu symbolu na wszystkich plikach obiektowych, nie udało mi się znaleźć tych symbole i crt1.o wydaje się nazywać symbole. czy jest coś, co może mieć te symbole w ich pliku obiektowym? – Cyro
Te pochodzą z niepochodzącej części biblioteki C; połączenie z '-lc' powinno pociągnąć plik'/usr/lib/libc.so', który jest właściwie fragmentem skryptu linker, który odwołuje się do właściwego pliku ('/ usr/lib/libc_nonshared.a'). Może problem z kolejnością linków? Jestem całkiem pewien, że najpierw chcesz 'crt1.o', po którym następuje' crti.o', potem twoje obiekty i biblioteki, a następnie 'crtn.o' na samym końcu - ale może' -lc' powinno przyjść po twoich obiektach (tuż przed 'crtn.o'), nie wcześniej. –
Połączyłem się z /usr/lib/libc_nonshared.a zaraz po wpisaniu w -lc i wszystko działało! stukrotne dzięki! – Cyro