Portál AbcLinuxu, 30. dubna 2025 14:44
Tato varianta je pro x86-64, protože inline assemblerDá se to napsat i tak, že to podporuje více platforem zaráz. Před nějakou dobou jsem si s tím hrál a zde je výsledek, který podporuje x86-64 a ARM (nebo aspoň 'běžné' ARMy, nějaký specielní možná fungovat nebude):
#include <stdint.h>
const uint64_t _start[] __attribute__((section(".text"))) = {
0xe3a00001909032eb, 0xe3a0200ce28f1014,
0xef000000e3a07004, 0xe3a07001e3a00000,
0x6c6c6548ef000000, 0x0a214d5241202c6f,
0x18ec834800000000, 0x4800000045058b48,
0xa20fc03148240489, 0x0c24548908245c89,
0x142444c710244c89, 0x01c0c74800000a21,
0x0001c7c748000000, 0x480124748d480000,
0x050f00000015c2c7, 0x480000003cc0c748,
0x6c654820050fff31, 0x00000000202c6f6c,
};
Kompiluje se pomocí gcc -static -nostdlib
Přeji příjemnou zábavu :)
Tato varianta je pro x86-64, protože inline assemblerU prvni verze jsem si rikal, jestli by to nebylo citelnejsi psat rovnou v assembleru... Ale napad vzit binarku a prelozit ji s gcc na binarku je dost originelni, to uznavam. ;-]
Ale napad vzit binarku a prelozit ji s gcc na binarku je dost originelni, to uznavam. ;-]Ten není můj, ten je odsud :) Můj je jen ten s tou platformní vidličkou...
supr stromeček žlutej :P :D ;D ;D
.text .code64 .globl _start _start: movb $1, %al /* syscall num */ movw $1, %di /* file descriptor */ movq $hello_str, %rsi /* text */ movq $(hello_str_end - hello_str), %rdx /* length */ syscall movb $60, %al xorw %di, %di syscall .data hello_str: .ascii "Hello, World!\n" hello_str_end:
as -64 hello.S -o hello.o && ld --omagic -s -x -static -T script.ld hello.o(tj. x86_64, ne debugovací symboly, strip a statické) Linker script stejný, jenom místo
.rodata
tam je .data
.
Tvoj kód/preklad | 864 B |
+ moje úpravy/preklad | 736 B |
Ušetrene: | 131 B (14,8 %) |
tttttssss echo má nějakejch 40kb :O ;D
tttttssss echo má nějakejch 40kb :O ;DU mě taky... Ale ten se pravděpodobně nepoužije, typicky se použije
echo
zabudovaný přímo v shellu...
kde jakoby vubec končí c a začíná asm :O :O
V čem je problém? Kdybys chtěl programovat tímhle způsobem, tak bys vyzobal/reimplementoval různé části standardní knihovny a řešil by sis přenositelnost sám. Teoreticky kdyby standardní knihovna byla moc velký moloch a potřeboval bys z ní jen nějakých 10 %, tak by to třeba smysl dávalo, ale typicky z ní budeš potřebovat větší část a navíc je tu ta přenositelnost… řešit tyhle věci v kódu aplikace mi přijde nesmyslné. Jako ukázka je to fajn, ale… jinak už by dávalo větší smysl to řešit na úrovni jazyka (tzn. úplně obejít céčko a místo něj mít něco jiného, co se napojuje na systémová volání).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.