LINUX.ORG.RU

asm в linux

 ,


0

1

Доброй ночи. Недавно решил «вспомнить молодость» и начать программировать на языке ассемблера, вот только под linux. И сразу столкнулся с проблемой. Когда линкую объектный файл получаю ошибку.

ld: i386 architecture of input file `asm.o' is incompatible with i386:x86-64 output

Пробовал явно задавать архитектуру

ld -b elf32-i386 asm.o 
и так
ld -b elf32-i386 -A i386 asm.o  
Не пойму, что от меня хочет ld? Ядро у меня x64, и приложения с elf64 тоже линкуются, а если нужно именно x32?

Еще один вопрос в файле /usr/include/asm/unistd.h располагаются номера системных вызовов. Как узнать их описание и то, как их использовать? Не все же ядро штудировать. Заранее спасибо.



Последнее исправление: promistrio (всего исправлений: 1)

в файле /usr/include/asm/unistd.h располагаются номера системных вызовов. Как узнать их описание и то, как их использовать?

У меня в /usr/include/asm-generic/unistd.h лежат сисколы в таком виде:

#define __NR_write 64
__SYSCALL(__NR_write, sys_write)

Откидываешь sys_ и куришь man write.

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

Спасибо, я так и делал, а как, например узнать что должно идти в rdi, а что в rsi?

Еще бы вопрос с ld решить.

promistrio
() автор топика
Ответ на: комментарий от ziemin

А никак без link.ld нельзя? Зачем так заморачиваться?

promistrio
() автор топика
Ответ на: комментарий от promistrio

а как, например узнать что должно идти в rdi, а что в rsi?

http://cs.lmu.edu/~ray/notes/linuxsyscalls/

To make a system call in 32-bit Linux, place the system call number in eax, then its arguments, in order, in ebx, ecx, edx, esi, edi, and ebp, then invoke int 80h.

To make a system call in 64-bit Linux, place the system call number in rax, then its arguments, in order, in rdi, rsi, rdx, r10, r8, and r9, then invoke syscall.

static_lab ★★★★★
()
Ответ на: комментарий от ziemin

Да именно это и нужно. Вот только вопрос, а зачем в ld указывать архитектуру и target, если используется эмулятор?

promistrio
() автор топика
Ответ на: комментарий от static_lab

Спасибо. Смена регистров связанна с особенностью работы процессоров или с чем? Почему так? Хотя это уже не так принципиально. Можно и не отвечать.

promistrio
() автор топика
Ответ на: комментарий от promistrio

Я так понял с такой опцией линкер будет эмулировать другой линкер. Со всякими установками по-умолчанию.

Может поэтому.

ziemin ★★
()
Ответ на: комментарий от promistrio
       --print-output-format
           Print the name of the default output format (perhaps influenced by other command-line options).  This is the string that would
           appear in an «OUTPUT_FORMAT» linker script command.

У меня:

$ ld --print-output-format
elf64-x86-64

ziemin ★★
()
Ответ на: комментарий от promistrio

Смена регистров связанна с особенностью работы процессоров или с чем?

Для x86-64 есть два стандарта вызовов: Microsoft (RCX/XMM0, RDX/XMM1, R8/XMM2, R9/XMM3) и System V (RDI, RSI, RDX, RCX, R8, R9, XMM0–7). Так что скорее всего просто так условились.

static_lab ★★★★★
()
Ответ на: комментарий от ziemin

Этот вопрос тоже соответствует теме поэтому я его задам здесь. Имеется системный вызов sys_open

int open(char * filename, int flags, int mode)
В x64 вызов имеет код = 2. Вот только не получается найти информацию о его использовании. В man не то, гугл больше пуТает, чем помогает. Код который ниже не работает. Точнее не создается файл. Почему, я понять не могу. (2=O_RDWR; 512=O_TRUNC; получил значения с помощью c++) http://jakeroid.com/sistemnyie-vyizovyi-dlya-rabotyi-s-faylami-v-linux.html
mov rax,2
mov rdi,str
mov rsi,2
or  rsi,512
mov rdx,0
syscall
А если изменить на (83=sys_mkdir)
mov rax,83
mov rdi,str
mov rsi,0
syscall
, то папка создается. Еще замечу, что файла не существует перед выполнением программы, но опция O_TRUNC должна его создать. Мне кажется, что нужно правильно указать третий параметр sys_open - int mode. А какой и где о нем почитать - неизвестно. Где вообще можно найти исходники системных вызовов или, что еще лучше, отыскать сишные обертки? Например в c++ если функция без int mode, следовательно задается значение по умолчанию, но какое?

P.S. Самый главный вопрос, это почему не работает код с sys_open, и как его исправить?

Заранее спасибо

promistrio
() автор топика
Ответ на: комментарий от promistrio

но опция O_TRUNC должна его создать

Нет. O_CREAT.

O_TRUNC урезает файл до 0.

Таким образом тебе нужны флаги O_CREAT | O_RDWR.

ziemin ★★
()
Ответ на: комментарий от promistrio

Мне кажется, что нужно правильно указать третий параметр sys_open - int mode. А какой и где о нем почитать - неизвестно

По твоей же ссылке:

Аргумент mode определяет права файла, если используется флаг O_CREAT, иначе просто игнорируется. Если подключить <sys/stat.h>, то можно использовать макроопределения вместо битовой маски, для задания прав:

S_IRUSR — чтения для владельца;

S_IWUSR — запись для владельца;

S_IXUSR — исполнение для владельца;

S_IRGRP — чтение для группы;

S_IWGRP — запись для группы;

S_IXGRP — исполнение для группы;

S_IROTH — чтения для остальных;

S_IWOTH — запись для остальных;

S_IXOTH — исполнение для остальных;

ziemin ★★
()
Ответ на: комментарий от ziemin

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

promistrio
() автор топика
Ответ на: комментарий от promistrio

Ксаи зря ты пренебрегаешь макроопределениями. Непонятно же, если числа использовать.

И or'ить флаги не надо. Препроцессор простые операции сам выполняет. Можно или сложить флаги или '|'.

ziemin ★★
()
Ответ на: комментарий от ziemin

Ксаи зря ты пренебрегаешь макроопределениями. Непонятно же, если числа использовать.

Ну это на скорую руку было сделано.

И or'ить флаги не надо. Препроцессор простые операции сам выполняет. Можно или сложить флаги или '|'.

С этим замечанием полностью согласен.

Вообще можно где-то посмотреть исходные коды функций? А то по хедерам бегать невозможно, они все равно только объявляют их названия. Вот мне вдруг захотелось сделать аналог WinAPI GetAsyncKeyState(). С чего начать, что искать? С этим у меня основная проблема. Да, гугл часто помогает, но не всегда.

promistrio
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.