Ineu Опубликовано 29 декабря, 2004 Жалоба Опубликовано 29 декабря, 2004 Доброе время суток всем! Это сообщений несколько перекликается с сообщением no start symbol. Проблема: При использовании НАСМа с -f elf создается нормальный объектный файл. Если его потом прогнать через gcc, получается нормальный, корректно исполняемый екзешник . А вот если отдать этот файл ld, тот вроде его линкует, ни на что не ругается, зато при запуске полученный файл вылетает с coredump'ом. В чем прикол? Цитата
EL[michlen] Опубликовано 29 декабря, 2004 Жалоба Опубликовано 29 декабря, 2004 Ну такое может быть, если формат файла, выданного ld не ELF и не a.out. Какой командой идет линковка? Цитата
Ineu Опубликовано 29 декабря, 2004 Автор Жалоба Опубликовано 29 декабря, 2004 cat > asm.asm extern _start _start: ^D nasm asm.asm -f elf ld asm.o ./a.out Segmentation fault Цитата
EL[michlen] Опубликовано 29 декабря, 2004 Жалоба Опубликовано 29 декабря, 2004 Цитата: extern _start _start: У меня такое вообще не компилируется. Может имелось в виду global _start? И еще: добавьте в начало asm.asm строку BITS 32. Если там стоит BITS 16, или по-умолчанию компилируется 16-битный код, то будет Segmentation fault. Цитата
Ineu Опубликовано 29 декабря, 2004 Автор Жалоба Опубликовано 29 декабря, 2004 Прошу прощения, global, конечно. А вот с BITS облом... одинаково кордампится что так, что так (( cat > 1.c int main (int ac, char *av[]) { return 0; } gcc -s 1.c дает исходник, который, переписанный под НАСМ, вылетает также. Я подумал было, что дело в стартовом коде, который хранится в crt0 etc, но это же настройка динамических библиотек, к чему она в статически скомпиленном исполнимом файле? Больше вариантов нет Цитата
EL[michlen] Опубликовано 30 декабря, 2004 Жалоба Опубликовано 30 декабря, 2004 Цитата: extern _start _start: ^D BITS 32 ; Тут global _start section .text ; тут _start: ret ; и тут Цитата
Гость Опубликовано 31 декабря, 2004 Жалоба Опубликовано 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. Цитата
EL[michlen] Опубликовано 31 декабря, 2004 Жалоба Опубликовано 31 декабря, 2004 Тогда такой вопрос: какая система? Не BSD, случаем? Просто у меня на Debian работает, не работает, только если я убираю BITS 32. Еще можно попробовать запускать ld с параметром -s (хотя у меня и без него все работает). Цитата
Гость Опубликовано 1 января, 2005 Жалоба Опубликовано 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 Цитата
EL[michlen] Опубликовано 1 января, 2005 Жалоба Опубликовано 1 января, 2005 Блин, я идиот. Как же сразу не вспомнил? =( Просто в Linux выход из программы идет не по ret, а вот так: BITS 32 global _start section .text _start: mov EAX,1 ; функция выхода int 0x80 Вот так. С Новым Годом! Цитата
Ineu Опубликовано 4 января, 2005 Автор Жалоба Опубликовано 4 января, 2005 Работает, спасибо огромное!!! Что же до "я идиот", то теперь я и сам думаю, как же мне это в голову не пришло... Вроде начинал изучать АСМ в TASM'е под ДОСом, должен был догадаться, что если системные вызовы осуществляются через прерывания, то и выход должен быть похож на mov ax, 4C00h; int 21h... Что ж, бывает )) Благодарю за долгую и плодотворную беседу. С наступающими Вас! Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.