diff options
-rw-r--r-- | test cases/ownstdlib/1 libc/libc.c | 35 | ||||
-rw-r--r-- | test cases/ownstdlib/1 libc/meson.build | 18 | ||||
-rw-r--r-- | test cases/ownstdlib/1 libc/prog.c | 7 | ||||
-rw-r--r-- | test cases/ownstdlib/1 libc/stdio.h | 5 | ||||
-rw-r--r-- | test cases/ownstdlib/1 libc/stubstart.s | 8 |
5 files changed, 73 insertions, 0 deletions
diff --git a/test cases/ownstdlib/1 libc/libc.c b/test cases/ownstdlib/1 libc/libc.c new file mode 100644 index 0000000..67261cb --- /dev/null +++ b/test cases/ownstdlib/1 libc/libc.c @@ -0,0 +1,35 @@ +/* Do not use this as the basis of your own libc. + * The code is probably unoptimal or wonky, as I + * had no prior experience with this, but instead + * just fiddled with the code until it worked. + */ + +#include<stdio.h> + +#define STDOUT 1 +#define SYS_WRITE 4 + +int simple_print(const char *msg, const long bufsize) { + int count; + long total_written = 0; + while(total_written < bufsize) { + asm( + "int $0x80\n\t" + : "=a"(count) + : "0"(SYS_WRITE), "b"(STDOUT), "c"(msg+total_written), "d"(bufsize-total_written) + :); + if(count == 0) { + return 1; + } + total_written += count; + } + return 0; +} + +int simple_strlen(const char *str) { + int len = 0; + while(str[len] != '\0') { + len++; + } + return len; +} diff --git a/test cases/ownstdlib/1 libc/meson.build b/test cases/ownstdlib/1 libc/meson.build new file mode 100644 index 0000000..1151926 --- /dev/null +++ b/test cases/ownstdlib/1 libc/meson.build @@ -0,0 +1,18 @@ +project('own libc', 'c') + +# A simple project that uses its own libc. + +# Start with manual flags to compile, then add platform support. + +libc = static_library('c', 'libc.c', 'stubstart.s', + c_args : '-nostdlib', + link_args : '-nostdlib', +) + +exe = executable('selfcontained', 'prog.c', + c_args : '-nostdlib', + link_args : '-nostdlib', + link_with : libc, +) + +test('standalone test', exe) diff --git a/test cases/ownstdlib/1 libc/prog.c b/test cases/ownstdlib/1 libc/prog.c new file mode 100644 index 0000000..9414bce --- /dev/null +++ b/test cases/ownstdlib/1 libc/prog.c @@ -0,0 +1,7 @@ + +#include<stdio.h> + +int main() { + const char *message = "Hello without stdlib.\n"; + return simple_print(message, simple_strlen(message)); +} diff --git a/test cases/ownstdlib/1 libc/stdio.h b/test cases/ownstdlib/1 libc/stdio.h new file mode 100644 index 0000000..c3f8f56 --- /dev/null +++ b/test cases/ownstdlib/1 libc/stdio.h @@ -0,0 +1,5 @@ +#pragma once + +int simple_print(const char *msg, const long bufsize); + +int simple_strlen(const char *str); diff --git a/test cases/ownstdlib/1 libc/stubstart.s b/test cases/ownstdlib/1 libc/stubstart.s new file mode 100644 index 0000000..0a6d972 --- /dev/null +++ b/test cases/ownstdlib/1 libc/stubstart.s @@ -0,0 +1,8 @@ +.globl _start + +_start: + + call main + movl %eax, %ebx + movl $1, %eax + int $0x80 |