Перейти к содержанию

NASM + LD = elf ?


Рекомендуемые сообщения

Доброе время суток всем!

Это сообщений несколько перекликается с сообщением no start symbol. Проблема:

При использовании НАСМа с -f elf создается нормальный объектный файл. Если его потом прогнать через gcc, получается нормальный, корректно исполняемый екзешник . А вот если отдать этот файл ld, тот вроде его линкует, ни на что не ругается, зато при запуске полученный файл вылетает с coredump'ом. В чем прикол?

Ссылка на комментарий
Поделиться на другие сайты

Цитата:

extern _start

_start:

У меня такое вообще не компилируется. Может имелось в виду global _start?

И еще: добавьте в начало asm.asm строку BITS 32. Если там стоит BITS 16, или по-умолчанию компилируется 16-битный код, то будет Segmentation fault.

Ссылка на комментарий
Поделиться на другие сайты

Прошу прощения, global, конечно.

А вот с BITS облом... одинаково кордампится что так, что так Sad((

cat > 1.c

int

main (int ac, char *av[])

{

return 0;

}

gcc -s 1.c дает исходник, который, переписанный под НАСМ, вылетает также.

Я подумал было, что дело в стартовом коде, который хранится в crt0 etc, но это же настройка динамических библиотек, к чему она в статически скомпиленном исполнимом файле? Больше вариантов нет Sad

Ссылка на комментарий
Поделиться на другие сайты

Не получается Sad((

Мне кажется, дело тут не в НАСМе, а в линковке, потому, что

#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.

Ссылка на комментарий
Поделиться на другие сайты

Тогда такой вопрос: какая система? Не BSD, случаем? Просто у меня на Debian работает, не работает, только если я убираю BITS 32.

Еще можно попробовать запускать ld с параметром -s (хотя у меня и без него все работает).

Ссылка на комментарий
Поделиться на другие сайты

С Новым Годом!!!

Желаю, чтобы пингвины были послушными, а окна - неназойливыми Smile

Система:

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

Ссылка на комментарий
Поделиться на другие сайты

Блин, я идиот. Как же сразу не вспомнил? =(

Просто в Linux выход из программы идет не по ret, а вот так:

BITS 32
global _start
section .text
_start:
    mov EAX,1 ; функция выхода
    int 0x80

Вот так. С Новым Годом!

Ссылка на комментарий
Поделиться на другие сайты

Работает, спасибо огромное!!!

Что же до "я идиот", то теперь я и сам думаю, как же мне это в голову не пришло... Вроде начинал изучать АСМ в TASM'е под ДОСом, должен был догадаться, что если системные вызовы осуществляются через прерывания, то и выход должен быть похож на mov ax, 4C00h; int 21h...

Что ж, бывает Smile))

Благодарю за долгую и плодотворную беседу.

С наступающими Вас!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...