Ineu Posted December 29, 2004 Report Posted December 29, 2004 Доброе время суток всем! Это сообщений несколько перекликается с сообщением no start symbol. Проблема: При использовании НАСМа с -f elf создается нормальный объектный файл. Если его потом прогнать через gcc, получается нормальный, корректно исполняемый екзешник . А вот если отдать этот файл ld, тот вроде его линкует, ни на что не ругается, зато при запуске полученный файл вылетает с coredump'ом. В чем прикол? Quote
EL[michlen] Posted December 29, 2004 Report Posted December 29, 2004 Ну такое может быть, если формат файла, выданного ld не ELF и не a.out. Какой командой идет линковка? Quote
Ineu Posted December 29, 2004 Author Report Posted December 29, 2004 cat > asm.asm extern _start _start: ^D nasm asm.asm -f elf ld asm.o ./a.out Segmentation fault Quote
EL[michlen] Posted December 29, 2004 Report Posted December 29, 2004 Цитата: extern _start _start: У меня такое вообще не компилируется. Может имелось в виду global _start? И еще: добавьте в начало asm.asm строку BITS 32. Если там стоит BITS 16, или по-умолчанию компилируется 16-битный код, то будет Segmentation fault. Quote
Ineu Posted December 29, 2004 Author Report Posted December 29, 2004 Прошу прощения, global, конечно. А вот с BITS облом... одинаково кордампится что так, что так (( cat > 1.c int main (int ac, char *av[]) { return 0; } gcc -s 1.c дает исходник, который, переписанный под НАСМ, вылетает также. Я подумал было, что дело в стартовом коде, который хранится в crt0 etc, но это же настройка динамических библиотек, к чему она в статически скомпиленном исполнимом файле? Больше вариантов нет Quote
EL[michlen] Posted December 30, 2004 Report Posted December 30, 2004 Цитата: extern _start _start: ^D BITS 32 ; Тут global _start section .text ; тут _start: ret ; и тут Quote
Guest Posted December 31, 2004 Report Posted December 31, 2004 Не получается (( Мне кажется, дело тут не в НАСМе, а в линковке, потому, что #cat > asm.asm global _start section .text _start: ret ^D #nasm -f elf asm.asm #ld asm.o -o asm #./asm Segmenation fault (core dumped) #cat > asm.asm global main section .text main: ret ^D #nasm -f elf asm.asm #gcc asm.o -o asm #./asm # То есть если использовать просто ld, создается статический екзешник, который и вылетает, а если прогнать через gcc, то нормально запускается, но уже динамический, при этом метку _start определять нельзя, поскольку такая уже есть в crt. Я думаю, тут что-то с опциями ld. Quote
EL[michlen] Posted December 31, 2004 Report Posted December 31, 2004 Тогда такой вопрос: какая система? Не BSD, случаем? Просто у меня на Debian работает, не работает, только если я убираю BITS 32. Еще можно попробовать запускать ld с параметром -s (хотя у меня и без него все работает). Quote
Guest Posted January 1, 2005 Report Posted January 1, 2005 С Новым Годом!!! Желаю, чтобы пингвины были послушными, а окна - неназойливыми Система: Mandrake 10 gcc version 3.3.2 (Mandrake Linux 10.0 3.3.2-6mdk) NASM version 0.98.38 compiled on Oct 13 2003 GNU ld version 2.14.90.0.7 20031029 Ядра: 2.6.8 торвальдовское 2.4.20 скомпиленное из исходников SRPMS ASPLinux Quote
EL[michlen] Posted January 1, 2005 Report Posted January 1, 2005 Блин, я идиот. Как же сразу не вспомнил? =( Просто в Linux выход из программы идет не по ret, а вот так: BITS 32 global _start section .text _start: mov EAX,1 ; функция выхода int 0x80 Вот так. С Новым Годом! Quote
Ineu Posted January 4, 2005 Author Report Posted January 4, 2005 Работает, спасибо огромное!!! Что же до "я идиот", то теперь я и сам думаю, как же мне это в голову не пришло... Вроде начинал изучать АСМ в TASM'е под ДОСом, должен был догадаться, что если системные вызовы осуществляются через прерывания, то и выход должен быть похож на mov ax, 4C00h; int 21h... Что ж, бывает )) Благодарю за долгую и плодотворную беседу. С наступающими Вас! Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.