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... Что ж, бывает )) Благодарю за долгую и плодотворную беседу. С наступающими Вас! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.