Jump to content

Recommended Posts

Posted

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

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

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

Posted

Цитата:

extern _start

_start:

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

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

Posted

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

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

cat > 1.c

int

main (int ac, char *av[])

{

return 0;

}

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

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

Posted

Не получается 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.

Posted

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

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

Posted

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

Желаю, чтобы пингвины были послушными, а окна - неназойливыми 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

Posted

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

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

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

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

Posted

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

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

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

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...