diff options
Diffstat (limited to 'test cases/unit/77 nostdlib')
-rw-r--r-- | test cases/unit/77 nostdlib/meson.build | 14 | ||||
-rw-r--r-- | test cases/unit/77 nostdlib/prog.c | 7 | ||||
-rw-r--r-- | test cases/unit/77 nostdlib/subprojects/mylibc/libc.c | 35 | ||||
-rw-r--r-- | test cases/unit/77 nostdlib/subprojects/mylibc/meson.build | 13 | ||||
-rw-r--r-- | test cases/unit/77 nostdlib/subprojects/mylibc/stdio.h | 5 | ||||
-rw-r--r-- | test cases/unit/77 nostdlib/subprojects/mylibc/stubstart.s | 8 |
6 files changed, 82 insertions, 0 deletions
diff --git a/test cases/unit/77 nostdlib/meson.build b/test cases/unit/77 nostdlib/meson.build new file mode 100644 index 0000000..9c5f949 --- /dev/null +++ b/test cases/unit/77 nostdlib/meson.build @@ -0,0 +1,14 @@ +project('own libc', 'c') + +# Not related to this test, but could not find a better place for this test. +assert(meson.get_cross_property('nonexisting', 'defaultvalue') == 'defaultvalue', + 'Cross prop getting is broken.') + +# A simple project that uses its own libc. + +# Note that we don't need to specify anything, the flags to use +# stdlib come from the cross file. + +exe = executable('selfcontained', 'prog.c') + +test('standalone test', exe) diff --git a/test cases/unit/77 nostdlib/prog.c b/test cases/unit/77 nostdlib/prog.c new file mode 100644 index 0000000..b9216ee --- /dev/null +++ b/test cases/unit/77 nostdlib/prog.c @@ -0,0 +1,7 @@ + +#include<stdio.h> + +int main(void) { + const char *message = "Hello without stdlib.\n"; + return simple_print(message, simple_strlen(message)); +} diff --git a/test cases/unit/77 nostdlib/subprojects/mylibc/libc.c b/test cases/unit/77 nostdlib/subprojects/mylibc/libc.c new file mode 100644 index 0000000..67261cb --- /dev/null +++ b/test cases/unit/77 nostdlib/subprojects/mylibc/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/unit/77 nostdlib/subprojects/mylibc/meson.build b/test cases/unit/77 nostdlib/subprojects/mylibc/meson.build new file mode 100644 index 0000000..ff4bdb2 --- /dev/null +++ b/test cases/unit/77 nostdlib/subprojects/mylibc/meson.build @@ -0,0 +1,13 @@ +project('own libc', 'c') + +# A very simple libc implementation + +# Do not specify -nostdlib & co. They come from cross specifications. + +libc = static_library('c', 'libc.c', 'stubstart.s') + +mylibc_dep = declare_dependency(link_with : libc, + include_directories : include_directories('.') +) + +meson.override_dependency('c_stdlib', mylibc_dep) diff --git a/test cases/unit/77 nostdlib/subprojects/mylibc/stdio.h b/test cases/unit/77 nostdlib/subprojects/mylibc/stdio.h new file mode 100644 index 0000000..c3f8f56 --- /dev/null +++ b/test cases/unit/77 nostdlib/subprojects/mylibc/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/unit/77 nostdlib/subprojects/mylibc/stubstart.s b/test cases/unit/77 nostdlib/subprojects/mylibc/stubstart.s new file mode 100644 index 0000000..0a6d972 --- /dev/null +++ b/test cases/unit/77 nostdlib/subprojects/mylibc/stubstart.s @@ -0,0 +1,8 @@ +.globl _start + +_start: + + call main + movl %eax, %ebx + movl $1, %eax + int $0x80 |