diff --git a/musl_src.gni b/musl_src.gni index 0ff2de65725789706a008151664b03dd4b2b47c5..e1675417df61092a71a5ca6b2735364ea2d8b43f 100755 --- a/musl_src.gni +++ b/musl_src.gni @@ -1825,6 +1825,7 @@ musl_inc_root_files = [ musl_src_porting_file = [ "arch/arm/bits/fenv.h", "arch/generic/bits/shm.h", + "arch/generic/crtbrand.s", "include/ctype.h", "include/pthread.h", "include/sys/capability.h", @@ -1849,7 +1850,12 @@ musl_src_porting_file = [ "src/thread/arm/syscall_cp.s", "src/ldso/dlclose.c", "ldso/dynlink.c", +<<<<<<< HEAD "src/exit/atexit.c", +======= + "crt/arm/crti.s", + "crt/aarch64/crti.s", +>>>>>>> 6b2c7684528edfe7e1b0d5064fa9fff242a965c5 ] musl_inc_hook_files = [ diff --git a/porting/linux/user/arch/generic/crtbrand.s b/porting/linux/user/arch/generic/crtbrand.s new file mode 100644 index 0000000000000000000000000000000000000000..7866d5472dfbdfbc6e685c806c96dc980fe7f53b --- /dev/null +++ b/porting/linux/user/arch/generic/crtbrand.s @@ -0,0 +1,10 @@ + .section .note.ohos.ident,"a",%note + .balign 4 + .type abitag, %object +abitag: + .long 2f-1f // int32_t namesz + .long 3f-2f // int32_t descsz +1:.ascii "OHOS\0" // char name[] +2:.long 1 // int32_t ohos_api +3: + .size abitag, .-abitag diff --git a/porting/linux/user/crt/aarch64/crti.s b/porting/linux/user/crt/aarch64/crti.s new file mode 100644 index 0000000000000000000000000000000000000000..4a9039d381a811ce1a0afe64cfcee3914c043d78 --- /dev/null +++ b/porting/linux/user/crt/aarch64/crti.s @@ -0,0 +1,15 @@ +.include "crtbrand.s" + +.section .init +.global _init +.type _init,%function +_init: + stp x29,x30,[sp,-16]! + mov x29,sp + +.section .fini +.global _fini +.type _fini,%function +_fini: + stp x29,x30,[sp,-16]! + mov x29,sp diff --git a/porting/linux/user/crt/arm/crti.s b/porting/linux/user/crt/arm/crti.s new file mode 100644 index 0000000000000000000000000000000000000000..72acf1869d6ca4f188237e10aa10b16b2d58cd13 --- /dev/null +++ b/porting/linux/user/crt/arm/crti.s @@ -0,0 +1,15 @@ +.include "crtbrand.s" + +.syntax unified + +.section .init +.global _init +.type _init,%function +_init: + push {r0,lr} + +.section .fini +.global _fini +.type _fini,%function +_fini: + push {r0,lr} diff --git a/porting/linux/user/src/exit/atexit.c b/porting/linux/user/src/exit/atexit.c deleted file mode 100644 index ff683dd6142d99ea23705957db67e9408893edfb..0000000000000000000000000000000000000000 --- a/porting/linux/user/src/exit/atexit.c +++ /dev/null @@ -1,92 +0,0 @@ -#include -#include -#include "libc.h" -#include "lock.h" - -/* Ensure that at least 32 atexit handlers can be registered without malloc */ -#define COUNT 32 - -static struct fl -{ - struct fl *next; - void (*f[COUNT])(void *); - void *a[COUNT]; - void *dso[COUNT]; -} builtin, *head; - -static int slot; -static volatile int lock[1]; - -void __funcs_on_exit() -{ - void (*func)(void *), *arg; - LOCK(lock); - for (; head; head=head->next, slot=COUNT) while(slot-->0) { - if (head->dso[slot] != NULL) { - func = head->f[slot]; - arg = head->a[slot]; - UNLOCK(lock); - func(arg); - LOCK(lock); - } - } - UNLOCK(lock); -} - -void __cxa_finalize(void *dso) -{ - void (*func)(void *), *arg; - LOCK(lock); - for (; head; head=head->next, slot=COUNT) while(slot-->0) { - if (dso == head->dso[slot]) { - func = head->f[slot]; - arg = head->a[slot]; - UNLOCK(lock); - func(arg); - LOCK(lock); - - head->dso[slot] = NULL; - } - } - UNLOCK(lock); -} - -int __cxa_atexit(void (*func)(void *), void *arg, void *dso) -{ - LOCK(lock); - - /* Defer initialization of head so it can be in BSS */ - if (!head) head = &builtin; - - /* If the current function list is full, add a new one */ - if (slot==COUNT) { - struct fl *new_fl = calloc(sizeof(struct fl), 1); - if (!new_fl) { - UNLOCK(lock); - return -1; - } - new_fl->next = head; - head = new_fl; - slot = 0; - } - - /* Append function to the list. */ - head->f[slot] = func; - head->a[slot] = arg; - head->dso[slot] = dso; - - slot++; - - UNLOCK(lock); - return 0; -} - -static void call(void *p) -{ - ((void (*)(void))(uintptr_t)p)(); -} - -int atexit(void (*func)(void)) -{ - return __cxa_atexit(call, (void *)(uintptr_t)func, 0); -} \ No newline at end of file