Changeset 2eadda9 in mainline for uspace/lib/c/generic
- Timestamp:
- 2018-07-11T17:45:30Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 99d3123
- Parents:
- c2c4127
- git-author:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-07-11 17:08:12)
- git-committer:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-07-11 17:45:30)
- Location:
- uspace/lib/c/generic
- Files:
-
- 1 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/as.c
rc2c4127 r2eadda9 60 60 { 61 61 return (void *) __SYSCALL5(SYS_AS_AREA_CREATE, (sysarg_t) base, 62 (sysarg_t) size, (sysarg_t) flags, (sysarg_t) _ end,62 (sysarg_t) size, (sysarg_t) flags, (sysarg_t) __progsymbols.end, 63 63 (sysarg_t) pager_info); 64 64 } -
uspace/lib/c/generic/async/server.c
rc2c4127 r2eadda9 1397 1397 // FIXME: The source has no business deciding destination address. 1398 1398 return ipc_answer_3(call->cap_handle, EOK, (sysarg_t) src, (sysarg_t) flags, 1399 (sysarg_t) _ end);1399 (sysarg_t) __progsymbols.end); 1400 1400 } 1401 1401 … … 1449 1449 assert(call); 1450 1450 1451 return ipc_answer_2(call->cap_handle, EOK, (sysarg_t) _ end,1451 return ipc_answer_2(call->cap_handle, EOK, (sysarg_t) __progsymbols.end, 1452 1452 (sysarg_t) dst); 1453 1453 } -
uspace/lib/c/generic/ddi.c
rc2c4127 r2eadda9 72 72 { 73 73 return (errno_t) __SYSCALL5(SYS_PHYSMEM_MAP, (sysarg_t) phys, 74 pages, flags, (sysarg_t) virt, (sysarg_t) _ end);74 pages, flags, (sysarg_t) virt, (sysarg_t) __progsymbols.end); 75 75 } 76 76 … … 145 145 return (errno_t) __SYSCALL6(SYS_DMAMEM_MAP, (sysarg_t) size, 146 146 (sysarg_t) map_flags, (sysarg_t) flags | DMAMEM_FLAGS_ANONYMOUS, 147 (sysarg_t) phys, (sysarg_t) virt, (sysarg_t) _ end);147 (sysarg_t) phys, (sysarg_t) virt, (sysarg_t) __progsymbols.end); 148 148 } 149 149 -
uspace/lib/c/generic/elf/elf_mod.c
rc2c4127 r2eadda9 356 356 (void *)((uint8_t *)entry->p_vaddr + elf->bias); 357 357 358 if (entry->p_filesz == 0) { 359 DPRINTF("Zero-sized ELF interp string.\n"); 360 return EE_INVALID; 361 } 358 362 if (elf->info->interp[entry->p_filesz - 1] != '\0') { 359 363 DPRINTF("Unterminated ELF interp string.\n"); -
uspace/lib/c/generic/libc.c
rc2c4127 r2eadda9 61 61 #endif 62 62 63 progsymbols_t __progsymbols; 64 63 65 static bool env_setup = false; 64 66 … … 116 118 * C++ Static constructor calls. 117 119 */ 118 ptrdiff_t init_array_entries = (__init_array_end - __init_array_start);119 120 120 for (int i = init_array_entries - 1; i >= 0; --i) 121 __init_array_start[i](); 121 if (__progsymbols.preinit_array) { 122 for (int i = __progsymbols.preinit_array_len - 1; i >= 0; --i) 123 __progsymbols.preinit_array[i](); 124 } 125 126 if (__progsymbols.init_array) { 127 for (int i = __progsymbols.init_array_len - 1; i >= 0; --i) 128 __progsymbols.init_array[i](); 129 } 122 130 123 131 /* … … 125 133 * according the result 126 134 */ 127 int retval = main(argc, argv);135 int retval = __progsymbols.main(argc, argv); 128 136 exit(retval); 129 137 } … … 136 144 * when the respective constructor is called. 137 145 */ 138 ptrdiff_t fini_array_entries = (__fini_array_end - __fini_array_start);139 146 140 for (int i = 0; i < fini_array_entries; ++i)141 __ fini_array_start[i]();147 for (int i = 0; i < __progsymbols.fini_array_len; ++i) 148 __progsymbols.fini_array[i](); 142 149 143 150 if (env_setup) { … … 148 155 149 156 __SYSCALL1(SYS_TASK_EXIT, false); 150 151 /* Unreachable */ 152 while (true) 153 ; 157 __builtin_unreachable(); 154 158 } 155 159 … … 157 161 { 158 162 __SYSCALL1(SYS_TASK_EXIT, true); 159 160 /* Unreachable */ 161 while (true) 162 ; 163 __builtin_unreachable(); 163 164 } 164 165 -
uspace/lib/c/generic/private/libc.h
rc2c4127 r2eadda9 36 36 #define LIBC_PRIVATE_LIBC_H_ 37 37 38 #include <types/common.h> 39 40 /* Type of the main C function. */ 41 typedef int (*main_fn_t)(int, char **); 42 38 43 /** 39 44 * Used for C++ constructors/destructors … … 43 48 typedef void (*fini_array_entry_t)(); 44 49 45 extern init_array_entry_t __init_array_start[]; 46 extern init_array_entry_t __init_array_end[]; 47 extern fini_array_entry_t __fini_array_start[]; 48 extern fini_array_entry_t __fini_array_end[]; 50 typedef struct { 51 main_fn_t main; 52 const void *elfstart; 53 const void *end; 54 init_array_entry_t *preinit_array; 55 int preinit_array_len; 56 init_array_entry_t *init_array; 57 int init_array_len; 58 fini_array_entry_t *fini_array; 59 int fini_array_len; 60 } progsymbols_t; 49 61 50 extern unsigned char _end[];62 extern progsymbols_t __progsymbols; 51 63 extern void __libc_main(void *) __attribute__((noreturn)); 52 64 extern void __libc_exit(int) __attribute__((noreturn)); 53 65 extern void __libc_abort(void) __attribute__((noreturn)); 54 extern int main(int, char *[]);55 66 56 67 #endif -
uspace/lib/c/generic/rtld/module.c
rc2c4127 r2eadda9 51 51 #include <rtld/module.h> 52 52 53 #include "../private/libc.h" 54 53 55 /** Create module for static executable. 54 56 * … … 73 75 74 76 const elf_segment_header_t *tls = 75 elf_get_phdr(__ executable_start, PT_TLS);77 elf_get_phdr(__progsymbols.elfstart, PT_TLS); 76 78 77 79 if (tls) { 78 uintptr_t bias = elf_get_bias(__ executable_start);80 uintptr_t bias = elf_get_bias(__progsymbols.elfstart); 79 81 module->tdata = (void *) (tls->p_vaddr + bias); 80 82 module->tdata_size = tls->p_filesz; -
uspace/lib/c/generic/tls.c
rc2c4127 r2eadda9 45 45 #include <elf/elf.h> 46 46 47 #include "private/libc.h" 48 47 49 #ifdef CONFIG_RTLD 48 50 #include <rtld/rtld.h> … … 61 63 62 64 const elf_segment_header_t *tls = 63 elf_get_phdr(__ executable_start, PT_TLS);65 elf_get_phdr(__progsymbols.elfstart, PT_TLS); 64 66 65 67 if (tls == NULL) … … 88 90 89 91 const elf_segment_header_t *tls = 90 elf_get_phdr(__ executable_start, PT_TLS);92 elf_get_phdr(__progsymbols.elfstart, PT_TLS); 91 93 if (tls == NULL) 92 94 return NULL; 93 95 94 uintptr_t bias = elf_get_bias(__ executable_start);96 uintptr_t bias = elf_get_bias(__progsymbols.elfstart); 95 97 size_t align = max(tls->p_align, _Alignof(tcb_t)); 96 98 … … 128 130 #endif 129 131 const elf_segment_header_t *tls = 130 elf_get_phdr(__ executable_start, PT_TLS);132 elf_get_phdr(__progsymbols.elfstart, PT_TLS); 131 133 132 134 assert(tls != NULL);
Note:
See TracChangeset
for help on using the changeset viewer.