Jump to content
Sign in to follow this  
Ineu

NASM + LD = elf ?

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites

Цитата:

extern _start

_start:

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

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

Share this post


Link to post
Share on other sites

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

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

cat > 1.c

int

main (int ac, char *av[])

{

return 0;

}

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

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

Share this post


Link to post
Share on other sites
Guest

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
Guest

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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...
Sign in to follow this  

×
×
  • Create New...