LINUX.ORG.RU

Linux, ассемблер и результат компиляции gcc


0

2

Привет, раньше я писал на ассемблере под Z80 процы, (это как вы поняли было очень давно) решил посмотреть бинарник программы скомпилированной с помощью gcc

#include <stdio.h>
main (){
    printf("1234567");
}
и ужаснулся, я знал что ассемблер перетерпел кучу новоизменений, но что бы так....

- С чем связанн такой рост бинарника, с архитектурой? с требованиями к исполняемым файлам?

- Что почитать по теме?

- И все же, есть ли компактный программки на asm в Linux?

	.file	"1.c"
	.section	.rodata.str1.1,"aMS",@progbits,1
.LC0:
	.string	"1234567"
	.section	.text.startup,"ax",@progbits
	.globl	main
	.type	main, @function
main:
.LFB12:
	.cfi_startproc
	movl	$.LC0, %esi
	movl	$1, %edi
	xorl	%eax, %eax
	jmp	__printf_chk
	.cfi_endproc
.LFE12:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.6.1-5ubuntu1) 4.6.1"
	.section	.note.GNU-stack,"",@progbits

разве так много?

aho
()
Ответ на: комментарий от mordovorot

> как у Вас получился такой компактный код?

gcc -S

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

aho, а как у Вас получился такой компактный код?

как уже написали - «gcc -Os -S», размер бинарника получается около 5 Кб, но за счет использования glibc и динамических библиотек, замена printf на write сократила размер бинарника до 1.5Кб, «поиграв» с опциями я получил около 700 байт, можно ли получить меньший размер именно с gcc я не знаю, но опять же - есть nasm

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

Спасибо за весьма полезные ответы и ссылки, много нового для себя открыл

mordovorot
() автор топика

> И все же, есть ли компактный программки на asm в Linux?

Приведенной тобой сложности - конечно есть. На любом сайте по ассемблеру в линукс.

anonymous
()
	.syntax unified
	.arch armv7-a
	.eabi_attribute 27, 3
	.fpu vfpv3-d16
	.eabi_attribute 20, 1
	.eabi_attribute 21, 1
	.eabi_attribute 23, 3
	.eabi_attribute 24, 1
	.eabi_attribute 25, 1
	.eabi_attribute 26, 2
	.eabi_attribute 30, 4
	.eabi_attribute 18, 4
	.thumb
	.file	"test.c"
	.text
	.align	1
	.global	main
	.thumb
	.thumb_func
	.type	main, %function
main:
	@ args = 0, pretend = 0, frame = 0
	@ frame_needed = 0, uses_anonymous_args = 0
	@ link register save eliminated.
	movs	r0, #1
	ldr	r1, .L2
	b	__printf_chk
.L3:
	.align	2
.L2:
	.word	.LC0
	.size	main, .-main
	.section	.rodata.str1.1,"aMS",%progbits,1
.LC0:
	.ascii	"1234567\000"
	.ident	"GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
	.section	.note.GNU-stack,"",%progbits

RISC ассемблер для человека - жуткая каша. Ассемблер не нужен.

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

[code=asm]format ELF executable 3

mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, msglen int 0x80

mov eax, 1 mov ebx, 0 int 0x80

msg db '1234567' msglen db $ - msg [/code]

Короче и на православном интеле.

anonymous
()
Ответ на: комментарий от anonymous
format ELF executable 3

mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, msglen int 0x80

mov eax, 1 mov ebx, 0 int 0x80

msg db '1234567' msglen db $ - msg 

Короче и на православном интеле.

anonymous
()
Ответ на: комментарий от anonymous
format ELF executable 3

mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, msglen
int 0x80

mov eax, 1
mov ebx, 0
int 0x80

msg db '1234567'
msglen db $ - msg 

Да шо за день.

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

> Короче и на православном интеле.

не спорю - самому дергать syscall'ы будет наиболее компактным вариантом

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

Но это, конечно, хитрость. Printf заменил на write. Ибо если цеплять glibc, то бинарник раздуется до 400-500 байт.

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

Да шо за день.

))) улыбнуло! Всем спасибо!

baverman Почитай Зубкова.

теперь точно!

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

RISC ассемблер для человека - жуткая каша. Ассемблер не нужен.

Три команды всего-то. В x86-выхлопе на одну больше.

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

>Три команды всего-то. В x86-выхлопе на одну больше.

В ARM еще все относительно хорошо, а вот во всяких MIPS, SPARC и прочих необходимость помнить о работе конвейера (delay slots и т.п) с непривычки выносит мозг.

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

> 45 байт на чистом асме, только чтоб вернуть 0

заголовок elf ЕМНИП больше занимает, в какой формат собирал?

aho
()
Ответ на: комментарий от AptGet

В ARM еще все относительно хорошо, а вот во всяких MIPS, SPARC и прочих необходимость помнить о работе конвейера (delay slots и т.п) с непривычки выносит мозг.

Как на первых Пеньтиумах. Да и на современном x86 железе тоже нужно мешок знаний иметь, чтобы тредобезопасный или low-latency код конопатить.

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

45 байт на чистом асме, только чтоб вернуть 0

320 байт на ARM, меньше не получилось :)

$ cat exit.s 
	.syntax unified
	.arch armv7-a
	.text
	.align	2
	.global _start
	.thumb
	.thumb_func
_start:
	mov	r0, #0
	mov	r7, #248 
	swi	0	
tc@orion:~$ 

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

>Как на первых Пеньтиумах. Да и на современном x86 железе тоже нужно мешок знаний иметь, чтобы тредобезопасный или low-latency код конопатить.

На х86 хотя бы просто производительность просядет, да и переупорядочит инструкции он сам, поэтому ИМХО x86 более пригоден для человека. А на RISC нужно запомнить, что те две инструкции записаны после перехода, а выполнятся после. Хотя перестановкой сам ассемблер может заниматься.

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

Где вы там дикие количества байт находите? Или вы исходите из того расчёта, что для покупки автомобиля необходимо иметь свой карманный лукойл?

mv ★★★★★
()
Ответ на: комментарий от AptGet
#!/bin/sh
:

так ещё короче. Возможно корректно будет и без двоеточия

mmarkk
()
Ответ на: комментарий от mv

Где вы там дикие количества байт находите? Или вы исходите из того расчёта, что для покупки автомобиля необходимо иметь свой карманный лукойл?

$ readelf -a exit
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x8055
  Start of program headers:          52 (bytes into file)
  Start of section headers:          116 (bytes into file)
  Flags:                             0x5000000, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         1
  Size of section headers:           40 (bytes)
  Number of section headers:         3
  Section header string table index: 2

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00008054 000054 00000c 00  AX  0   0  4
  [ 2] .shstrtab         STRTAB          00000000 000060 000011 00      0   0  1
...

Удалил еще одну секцию, осталось 236 байт, в основном заголовки. Особой оптимизирующей магией не владею.

AptGet ★★★
()

> программки на asm

ох уж эти мне не переносимые программки

x0r ★★★★★
()
Ответ на: комментарий от AptGet
Disassembly of section .text:

0000000000400400 <main>:
  400400:       bf dc 05 40 00          mov    $0x4005dc,%edi
  400405:       31 c0                   xor    %eax,%eax
  400407:       e9 d4 ff ff ff          jmpq   4003e0 <printf@plt>

12 байт кода, имеющего непосредственное отношение к вышеприведённой сишной программе.

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

неее, ассемблер ARM весьма кавайный, это просто директив в данном примере слишком много :)

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

> Это особая хакерская магия

которая отказывается работать на современных системах

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