Я протестировал два успешных выхода из минимальных программ, сначала использует libc
, второй не использует libc
.почему компоновщик не разделяет основную рутину с исполняемого файла?
Первое:
segment .text
global main
main:
xor eax, eax
ret
Сложение и проверьте размер:
yasm -f elf64 main.s; clang -o main main.o; stat ./main
...
Size: 8552
...
Второе:
segment .text
global _start
_start:
mov eax, 60
xor edi, edi
syscall
Сложение и проверьте размер:
yasm -f elf64 main.s; ld -o main main.o; stat ./main
...
Size: 704
---
Очевидно, что программа с использованием основных больше по размеру. Почему линкеры не разделяют main рутина из двоичных файлов для оптимизации размера? Я имею в виду линкеры, которые получают объектные файлы после компиляции программы C.
Что вы имеете в виду? Я спрашивал о возможности «вырезать» код из основного и вставить его в _start, так что main не будет вызываться. –
Это было предназначено как шутка. Sry, за то, что пропустил «;-)». – alk
Я не вижу никакого кода С. Вы проверили ** содержимое **? Заключение по размеру двоичного кода, что происходит внутри, - очень плохой подход. В вашем коде Ассемблера нет функции/«подпрограммы»! Просто метка, которая генерирует символ. – Olaf