LINUX.ORG.RU

NASM extern = сильное увеличение размера файла

 ,


0

2

Доброго …

Чё-т взгрустнулось и решил попробовать. На чистом ассемблере «Привет мир» получается 4,6 кб Если уменьшить код и использовать библиотечные (Сишные) функции (puts), то размер итогового фалй = 12,5 кб

Я всегда думал, что будет меньше! Оно что, кладёт весь «универсальный» puts в тело программы?

Ощем, я не врубаюсь )



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

так это всё заголовок elf-формата занимает

$ cat hello.asm 
section .data
    hello db 'hello world, mf', 0xA

section .text
    global _start

_start:
    mov rax, 1
    mov rdi, rax
    mov rsi, hello
    mov rdx, 16
    syscall
    mov rax, 60
    xor rdi, rdi
    syscall
$ nasm -f elf64 hello.asm -o hello.o && ld -o hello hello.o && strip hello && ls -shR hello && chmod +x hello && ./hello
12K hello
hello world, mf

madcore ★★★★★
()
Ответ на: комментарий от d
; ----------------------------------------------------------------------------------------
; Writes "Hello, World" to the console using only system calls. Runs on 64-bit Linux only.
; To assemble and run:
;
;     nasm -felf64 hello.asm && ld hello.o && ./a.out
; ----------------------------------------------------------------------------------------

          global    _start

          section   .text
_start:   mov       rax, 1                  ; system call for write
          mov       rdi, 1                  ; file handle 1 is stdout
          mov       rsi, message            ; address of string to output
          mov       rdx, 13                 ; number of bytes
          syscall                           ; invoke operating system to do the write
          mov       rax, 60                 ; system call for exit
          xor       rdi, rdi                ; exit code 0
          syscall                           ; invoke operating system to exit

          section   .data
message:  db        "Hello, World", 10      ; note the newline at the end

4 кб

; ----------------------------------------------------------------------------------------
; Writes "Hola, mundo" to the console using a C library. Runs on Linux.
;
;     nasm -felf64 hola.asm && gcc hola.o && ./a.out
; ----------------------------------------------------------------------------------------

          global    main
          extern    puts

          section   .text
main:                                       ; This is called by the C library startup code
          mov       rdi, message            ; First integer (or pointer) argument in rdi
          call      puts                    ; puts(message)
          ret                               ; Return from main back into C library wrapper
message:
          db        "Hola, mundo", 0        ; Note strings must be terminated with 0 in C

12 кб

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

Ты заметил что в первом у тебя _start а во втором main? Точка входа то всё равно _start, а где она? Вот этот самый код, статическая часть libc, теперь вкомпилена в твой бинарник и она и занимает лишнее место.

firkax ★★★★★
()

Вкратце (поздно, спать хочу): сегмент программы добивается нулями до размера страницы, то есть 4к, если не использовать специальные флаги линковщика, не-помню-какие. На чистом асме у тебя все в .text попадает, получается один сегмент, 4к. Сишные функции наверняка еще .data и .bss добавляют, в итоге выходит 12. Как-то так.

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

squareroot ★★★★ Bfgeshka ★★★★★

Спсб! Психанул! Т.к. 25 лет назад написал что-то типа notepad. 10-12 кб (точно помню, что не больше) Там все функции системы - отрисовать букву и … Может ещё чего )

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