Cosa posso fare se non c'è printf(), fopen(), ecc.?
Finché si sa come interfacciare il sistema che si sta utilizzando è possibile vivere senza la libreria C standard. Nei sistemi embedded in cui si hanno solo diversi kilobyte di memoria, probabilmente non si vuole usare la libreria standard.
Ecco un mondo Hello! esempio su Linux e Windows senza l'utilizzo di funzioni C standard:
Per esempio su Linux è possibile richiamare il sistema Linux chiama direttamente in assembly inline:
/* 64 bit linux. */
#define SYSCALL_EXIT 60
#define SYSCALL_WRITE 1
void sys_exit(int error_code)
{
asm volatile
(
"syscall"
:
: "a"(SYSCALL_EXIT), "D"(error_code)
: "rcx", "r11", "memory"
);
}
int sys_write(unsigned fd, const char *buf, unsigned count)
{
unsigned ret;
asm volatile
(
"syscall"
: "=a"(ret)
: "a"(SYSCALL_WRITE), "D"(fd), "S"(buf), "d"(count)
: "rcx", "r11", "memory"
);
return ret;
}
int _start()
{
const char hwText[] = "Hello world!\n";
sys_write(1, hwText, sizeof(hwText));
sys_exit(12);
return 0;
}
compilare questo con:
gcc -nostdlib nostd.c
E emette Hello world!
ed esce.
Su Windows le chiamate di sistema non vengono pubblicate, ma sono nascoste dietro un altro livello di astrazione, il kernel32.dll. Che viene sempre caricato all'avvio del programma, che lo si voglia o no. Così si può semplicemente includere windows.h e utilizzare l'API Win32:
#include <windows.h>
int _start()
{
const char str[] = "Hello world!\n";
HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD written;
WriteFile(stdout, str, sizeof(str), &written, NULL);
ExitProcess(12);
return 0;
}
Il windows.h
non ha nulla a che fare con la libreria standard C, come si dovrebbe essere in grado di scrivere i programmi di Windows su qualsiasi altra lingua troppo.
È possibile compilare utilizzando gli strumenti MinGW in questo modo:
gcc -nostdlib C:\Windows\System32\kernel32.dll nostdlib.c
Poi il compilatore è abbastanza intelligente per risolvere le dipendenze di importazione e compilare il programma.
Se si disassembla il programma, è possibile vedere solo il proprio codice, non c'è nessuna libreria standard gonfia.
Quindi è possibile utilizzare C senza la libreria standard.
+ 1 per la domanda interessante – fmsf