| #!/usr/bin/env bash |
| ############################################################################ |
| # tools/build-globals.sh |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. The |
| # ASF licenses this file to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance with the |
| # License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations |
| # under the License. |
| # |
| ############################################################################ |
| # |
| # Script to create modlib_global.S which contains a structure define |
| # the API names and addresses we will export for resolving symbols in |
| # dynamic loaded shared objects. Typically these are libc APIs. |
| |
| # |
| # Symbols to ignore within the NuttX libraries |
| # |
| FILTER="^lib_low|^FUNCTION|^STUB|^__start|^_vect|^arm_|^arp_|^bch|^binfmt|^blake|^block_|^cdcacm|^chksum|^clock_|^close_|^crypto_|^devif_|^devnull|^devuran|^devzero|^emerg|^epoll_|^elf_|^_dbgR|^dq_|^env_|^file_|^files_|^fs_|^ftl_|^g_|^get_|^group_|^global|^hcom|^i2c_|^inode_|^iob_|^irq_|^kmm_|^lfs_|^lib_|^local_|^mm_|^modlib_|^mpu_|^mq_|^nglobals|^net_|^netdev_|^nx|^pipecommon|^posix_spawn_file|^psock_|^ramlog|^rammap|^readline_|^register_|^sched_|^sockfd|^spawn_|^sq_|^stm32|^symtab_|^syslog_|^syslogstream|^task_|^tcp_|^timer_|^uart_|^ub[12]|^udp_|^umm_|^umount|^unload_|^unregister|^up_|^usb|^usrsock_|^watchdog|^wd_|globalNames$|nglobals$|global_table$|^\.l" |
| |
| if [ -z "${NM}" ]; then |
| NM="nm" |
| fi |
| |
| # |
| # Extract symbols from the runtime |
| # |
| SYMS=`cat System.map | awk '{print $3}' | sort | grep -Ev ${FILTER}` |
| SYM=(${SYMS}) |
| GLOBALS="libs/libc/modlib/modlib_globals.S" |
| |
| # |
| # Generate the modlib_xxxx_globals.S file |
| # |
| cat >${GLOBALS} <<__EOF__ |
| #ifdef __CYGWIN__ |
| # define SYMBOL(s) _##s |
| # define GLOBAL .global |
| # define SECTION .data |
| .macro GLOBAL ep |
| .global SYMBOL(\ep) |
| .type SYMBOL(\ep), "object" |
| .endm |
| .macro SIZE ep |
| .endm |
| #elif defined(__ELF__) |
| # define SYMBOL(s) s |
| # define SECTION .data |
| .macro GLOBAL ep |
| .global SYMBOL(\ep) |
| .type SYMBOL(\ep), "object" |
| .endm |
| .macro SIZE ep |
| .size SYMBOL(\ep), . - SYMBOL(\ep) |
| .endm |
| #else |
| # define SYMBOL(s) _##s |
| # define SECTION .section __DATA,__data |
| .macro GLOBAL ep |
| .private_extern SYMBOL(\ep) |
| .globl SYMBOL(\ep) |
| .endm |
| .macro SIZE ep |
| .endm |
| #endif |
| |
| #if __SIZEOF_POINTER__ == 8 |
| .macro globalEntry index, ep |
| .quad .l\index |
| .quad \ep |
| .endm |
| # define ALIGN 8 |
| #else |
| .macro globalEntry index, ep |
| .long .l\index |
| .long \ep |
| .endm |
| # define ALIGN 4 |
| #endif |
| #ifdef __ARM_ARCH_ISA_THUMB2 |
| # ifdef __ARM_ARCH_7M__ |
| .arch armv7e-m |
| # elif defined ___ARM_ARCH 8 |
| .arch armv8-m.base |
| #endif |
| #ifdef __ARM_ASM_SYNTAX_UNIFIED__ |
| .syntax unified |
| #endif |
| .thumb |
| #endif |
| .data |
| .align ALIGN |
| GLOBAL globalNames |
| |
| SYMBOL(globalNames): |
| __EOF__ |
| |
| for ((i = 0; i < ${#SYM[@]}; i++)) |
| do |
| echo ".l${i}: .string \"${SYM[$i]}\"" >>${GLOBALS} |
| done |
| |
| cat >>${GLOBALS} <<__EOF__ |
| SIZE globalNames |
| |
| .align ALIGN |
| GLOBAL nglobals |
| SYMBOL(nglobals): |
| .word ${#SYM[@]} |
| SIZE nglobals |
| |
| .align ALIGN |
| GLOBAL global_table |
| SYMBOL(global_table): |
| __EOF__ |
| |
| for ((i = 0; i < ${#SYM[@]}; i++)) |
| do |
| echo " globalEntry ${i}, ${SYM[$i]}" >>${GLOBALS} |
| done |
| |
| cat >>${GLOBALS} <<__EOF__ |
| SIZE global_table |
| __EOF__ |
| |
| echo "${#SYM[@]} symbols defined" |