/* * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #include #include #include #include #include #include #include #include "rom/ets_sys.h" #include "private/elf_symbol.h" extern int __ltdf2(double a, double b); extern unsigned int __fixunsdfsi(double a); extern int __gtdf2(double a, double b); extern double __floatunsidf(unsigned int i); extern double __divdf3(double a, double b); /** @brief Libc public functions symbols look-up table */ static const struct esp_elfsym g_esp_libc_elfsyms[] = { /* string.h */ ESP_ELFSYM_EXPORT(strerror), ESP_ELFSYM_EXPORT(memset), ESP_ELFSYM_EXPORT(memcpy), ESP_ELFSYM_EXPORT(strlen), ESP_ELFSYM_EXPORT(strtod), ESP_ELFSYM_EXPORT(strrchr), ESP_ELFSYM_EXPORT(strchr), ESP_ELFSYM_EXPORT(strcmp), ESP_ELFSYM_EXPORT(strtol), ESP_ELFSYM_EXPORT(strcspn), ESP_ELFSYM_EXPORT(strncat), /* stdio.h */ ESP_ELFSYM_EXPORT(puts), ESP_ELFSYM_EXPORT(putchar), ESP_ELFSYM_EXPORT(fputc), ESP_ELFSYM_EXPORT(fputs), ESP_ELFSYM_EXPORT(printf), ESP_ELFSYM_EXPORT(vfprintf), ESP_ELFSYM_EXPORT(fprintf), ESP_ELFSYM_EXPORT(fwrite), /* unistd.h */ ESP_ELFSYM_EXPORT(usleep), ESP_ELFSYM_EXPORT(sleep), ESP_ELFSYM_EXPORT(exit), ESP_ELFSYM_EXPORT(close), /* stdlib.h */ ESP_ELFSYM_EXPORT(malloc), ESP_ELFSYM_EXPORT(calloc), ESP_ELFSYM_EXPORT(realloc), ESP_ELFSYM_EXPORT(free), /* time.h */ ESP_ELFSYM_EXPORT(clock_gettime), ESP_ELFSYM_EXPORT(strftime), /* pthread.h */ ESP_ELFSYM_EXPORT(pthread_create), ESP_ELFSYM_EXPORT(pthread_attr_init), ESP_ELFSYM_EXPORT(pthread_attr_setstacksize), ESP_ELFSYM_EXPORT(pthread_detach), ESP_ELFSYM_EXPORT(pthread_join), ESP_ELFSYM_EXPORT(pthread_exit), /* newlib */ ESP_ELFSYM_EXPORT(__errno), ESP_ELFSYM_EXPORT(__getreent), #ifdef __HAVE_LOCALE_INFO__ ESP_ELFSYM_EXPORT(__locale_ctype_ptr), #else ESP_ELFSYM_EXPORT(_ctype_), #endif /* math */ ESP_ELFSYM_EXPORT(__ltdf2), ESP_ELFSYM_EXPORT(__fixunsdfsi), ESP_ELFSYM_EXPORT(__gtdf2), ESP_ELFSYM_EXPORT(__floatunsidf), ESP_ELFSYM_EXPORT(__divdf3), /* getopt.h */ ESP_ELFSYM_EXPORT(getopt_long), ESP_ELFSYM_EXPORT(optind), ESP_ELFSYM_EXPORT(opterr), ESP_ELFSYM_EXPORT(optarg), ESP_ELFSYM_EXPORT(optopt), /* setjmp.h */ ESP_ELFSYM_EXPORT(longjmp), ESP_ELFSYM_EXPORT(setjmp), ESP_ELFSYM_END }; /** @brief ESP-IDF public functions symbols look-up table */ static const struct esp_elfsym g_esp_espidf_elfsyms[] = { /* sys/socket.h */ ESP_ELFSYM_EXPORT(lwip_bind), ESP_ELFSYM_EXPORT(lwip_setsockopt), ESP_ELFSYM_EXPORT(lwip_socket), ESP_ELFSYM_EXPORT(lwip_listen), ESP_ELFSYM_EXPORT(lwip_accept), ESP_ELFSYM_EXPORT(lwip_recv), ESP_ELFSYM_EXPORT(lwip_recvfrom), ESP_ELFSYM_EXPORT(lwip_send), ESP_ELFSYM_EXPORT(lwip_sendto), ESP_ELFSYM_EXPORT(lwip_connect), /* arpa/inet.h */ ESP_ELFSYM_EXPORT(ipaddr_addr), ESP_ELFSYM_EXPORT(lwip_htons), ESP_ELFSYM_EXPORT(lwip_htonl), ESP_ELFSYM_EXPORT(ip4addr_ntoa), /* ROM functions */ ESP_ELFSYM_EXPORT(ets_printf), ESP_ELFSYM_END }; /** * @brief Find symbol address by name. * * @param sym_name - Symbol name * * @return Symbol address if success or 0 if failed. */ uintptr_t elf_find_sym_default(const char *sym_name) { const struct esp_elfsym *syms; #ifdef CONFIG_ELF_LOADER_LIBC_SYMBOLS syms = g_esp_libc_elfsyms; while (syms->name) { if (!strcmp(syms->name, sym_name)) { return (uintptr_t)syms->sym; } syms++; } #else syms = g_esp_libc_elfsyms; (void)syms; #endif #ifdef CONFIG_ELF_LOADER_ESPIDF_SYMBOLS syms = g_esp_espidf_elfsyms; while (syms->name) { if (!strcmp(syms->name, sym_name)) { return (uintptr_t)syms->sym; } syms++; } #else syms = g_esp_espidf_elfsyms; (void)syms; #endif #ifdef CONFIG_ELF_LOADER_CUSTOMER_SYMBOLS extern const struct esp_elfsym g_customer_elfsyms[]; syms = g_customer_elfsyms; while (syms->name) { if (!strcmp(syms->name, sym_name)) { return (uintptr_t)syms->sym; } syms++; } #endif return 0; }