Changeset 2eadda9 in mainline for uspace/lib/c/generic


Ignore:
Timestamp:
2018-07-11T17:45:30Z (7 years ago)
Author:
Jiří Zárevúcky <jiri.zarevucky@…>
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)
Message:

Remove undefined references to main program from shared libc.

Location:
uspace/lib/c/generic
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/as.c

    rc2c4127 r2eadda9  
    6060{
    6161        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,
    6363            (sysarg_t) pager_info);
    6464}
  • uspace/lib/c/generic/async/server.c

    rc2c4127 r2eadda9  
    13971397        // FIXME: The source has no business deciding destination address.
    13981398        return ipc_answer_3(call->cap_handle, EOK, (sysarg_t) src, (sysarg_t) flags,
    1399             (sysarg_t) _end);
     1399            (sysarg_t) __progsymbols.end);
    14001400}
    14011401
     
    14491449        assert(call);
    14501450
    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,
    14521452            (sysarg_t) dst);
    14531453}
  • uspace/lib/c/generic/ddi.c

    rc2c4127 r2eadda9  
    7272{
    7373        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);
    7575}
    7676
     
    145145        return (errno_t) __SYSCALL6(SYS_DMAMEM_MAP, (sysarg_t) size,
    146146            (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);
    148148}
    149149
  • uspace/lib/c/generic/elf/elf_mod.c

    rc2c4127 r2eadda9  
    356356                    (void *)((uint8_t *)entry->p_vaddr + elf->bias);
    357357
     358                if (entry->p_filesz == 0) {
     359                        DPRINTF("Zero-sized ELF interp string.\n");
     360                        return EE_INVALID;
     361                }
    358362                if (elf->info->interp[entry->p_filesz - 1] != '\0') {
    359363                        DPRINTF("Unterminated ELF interp string.\n");
  • uspace/lib/c/generic/libc.c

    rc2c4127 r2eadda9  
    6161#endif
    6262
     63progsymbols_t __progsymbols;
     64
    6365static bool env_setup = false;
    6466
     
    116118         * C++ Static constructor calls.
    117119         */
    118         ptrdiff_t init_array_entries = (__init_array_end - __init_array_start);
    119120
    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        }
    122130
    123131        /*
     
    125133         * according the result
    126134         */
    127         int retval = main(argc, argv);
     135        int retval = __progsymbols.main(argc, argv);
    128136        exit(retval);
    129137}
     
    136144         * when the respective constructor is called.
    137145         */
    138         ptrdiff_t fini_array_entries = (__fini_array_end - __fini_array_start);
    139146
    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]();
    142149
    143150        if (env_setup) {
     
    148155
    149156        __SYSCALL1(SYS_TASK_EXIT, false);
    150 
    151         /* Unreachable */
    152         while (true)
    153                 ;
     157        __builtin_unreachable();
    154158}
    155159
     
    157161{
    158162        __SYSCALL1(SYS_TASK_EXIT, true);
    159 
    160         /* Unreachable */
    161         while (true)
    162                 ;
     163        __builtin_unreachable();
    163164}
    164165
  • uspace/lib/c/generic/private/libc.h

    rc2c4127 r2eadda9  
    3636#define LIBC_PRIVATE_LIBC_H_
    3737
     38#include <types/common.h>
     39
     40/* Type of the main C function. */
     41typedef int (*main_fn_t)(int, char **);
     42
    3843/**
    3944 * Used for C++ constructors/destructors
     
    4348typedef void (*fini_array_entry_t)();
    4449
    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[];
     50typedef 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;
    4961
    50 extern unsigned char _end[];
     62extern progsymbols_t __progsymbols;
    5163extern void __libc_main(void *) __attribute__((noreturn));
    5264extern void __libc_exit(int) __attribute__((noreturn));
    5365extern void __libc_abort(void) __attribute__((noreturn));
    54 extern int main(int, char *[]);
    5566
    5667#endif
  • uspace/lib/c/generic/rtld/module.c

    rc2c4127 r2eadda9  
    5151#include <rtld/module.h>
    5252
     53#include "../private/libc.h"
     54
    5355/** Create module for static executable.
    5456 *
     
    7375
    7476        const elf_segment_header_t *tls =
    75             elf_get_phdr(__executable_start, PT_TLS);
     77            elf_get_phdr(__progsymbols.elfstart, PT_TLS);
    7678
    7779        if (tls) {
    78                 uintptr_t bias = elf_get_bias(__executable_start);
     80                uintptr_t bias = elf_get_bias(__progsymbols.elfstart);
    7981                module->tdata = (void *) (tls->p_vaddr + bias);
    8082                module->tdata_size = tls->p_filesz;
  • uspace/lib/c/generic/tls.c

    rc2c4127 r2eadda9  
    4545#include <elf/elf.h>
    4646
     47#include "private/libc.h"
     48
    4749#ifdef CONFIG_RTLD
    4850#include <rtld/rtld.h>
     
    6163
    6264        const elf_segment_header_t *tls =
    63             elf_get_phdr(__executable_start, PT_TLS);
     65            elf_get_phdr(__progsymbols.elfstart, PT_TLS);
    6466
    6567        if (tls == NULL)
     
    8890
    8991        const elf_segment_header_t *tls =
    90             elf_get_phdr(__executable_start, PT_TLS);
     92            elf_get_phdr(__progsymbols.elfstart, PT_TLS);
    9193        if (tls == NULL)
    9294                return NULL;
    9395
    94         uintptr_t bias = elf_get_bias(__executable_start);
     96        uintptr_t bias = elf_get_bias(__progsymbols.elfstart);
    9597        size_t align = max(tls->p_align, _Alignof(tcb_t));
    9698
     
    128130#endif
    129131        const elf_segment_header_t *tls =
    130             elf_get_phdr(__executable_start, PT_TLS);
     132            elf_get_phdr(__progsymbols.elfstart, PT_TLS);
    131133
    132134        assert(tls != NULL);
Note: See TracChangeset for help on using the changeset viewer.