From 5dfbf2d6478e73b55ff73d52944ae6f0a6cdf8a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Mon, 15 Dec 2025 16:00:33 +0900 Subject: [PATCH] =?UTF-8?q?=E6=9C=80=E5=88=9D=E3=82=B3=E3=83=9F=E3=83=83?= =?UTF-8?q?=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 ++ README.md | 30 ++++++++++++++++++++++++++++++ main.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 main.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7575265 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +all: + cc -nostdlib -static -masm=intel -o main main.c diff --git a/README.md b/README.md new file mode 100644 index 0000000..c5437ce --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +此れはlibcなしの「こんにちは、世界」のデモです。\ +Linux、FreeBSD、OpenBSD、NetBSD、及びmacOSで実行出来ますが、IntelやAMD CPUが必須に成ります。 + +```sh +make +$ cc -nostdlib -static -masm=intel -o main main.c +$ ls -thal main +-rwxr-xr-x 1 suwako suwako 1.6K 12月 15 15:57 main +$ file main +main: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), statically linked, not stripped +$ objdump -M intel -d main + +main: file format elf64-x86-64 + +Disassembly of section .text: + +00000000002011f0 <_start>: + 2011f0: 55 push rbp + 2011f1: 48 89 e5 mov rbp, rsp + 2011f4: b8 04 00 00 00 mov eax, 0x4 + 2011f9: bf 01 00 00 00 mov edi, 0x1 + 2011fe: 48 c7 c6 20 22 20 00 mov rsi, 0x202220 + 201205: ba 1c 00 00 00 mov edx, 0x1c + 20120a: 0f 05 syscall + 20120c: b8 01 00 00 00 mov eax, 0x1 + 201211: 31 ff xor edi, edi + 201213: 0f 05 syscall + 201215: 5d pop rbp + 201216: c3 ret +``` diff --git a/main.c b/main.c new file mode 100644 index 0000000..ba3c836 --- /dev/null +++ b/main.c @@ -0,0 +1,33 @@ +#if defined(__linux__) +#define SYS_WRITE 1 +#define SYS_EXIT 60 +#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) +#define SYS_WRITE 4 +#define SYS_EXIT 1 +#elif defined(__APPLE__) +#define SYS_WRITE 0x2000004 +#define SYS_EXIT 0x2000001 +#endif + +char msg[] = "こんにちは、世界!\n"; + +void _start() { + asm volatile( + ".intel_syntax noprefix\n" + "mov eax, %[sys_write]\n" + "mov edi, 1\n" + "mov rsi, offset msg\n" + "mov edx, %[len]\n" + "syscall\n" + + "mov eax, %[sys_exit]\n" + "xor edi, edi\n" + "syscall\n" + + ".att_syntax prefix\n" + :: [sys_write] "i" (SYS_WRITE), + [sys_exit] "i" (SYS_EXIT), + [len] "i" (sizeof(msg) - 1) + : "rax", "rdi", "rsi", "rdx", "rcx", "r11" + ); +}