Home | History | Annotate | Download | only in tests
      1 #!/bin/sh
      2 verbose=false
      3 if [ "$1" = "-v" ]; then
      4     verbose=true
      5     shift
      6 fi
      7 
      8 build_plat=@build_arch@
      9 plat=@arch@
     10 os=@target_os@
     11 num_errors=0
     12 
     13 LIBUNWIND=../src/.libs/libunwind.so
     14 LIBUNWIND_GENERIC=../src/.libs/libunwind-${plat}.so
     15 
     16 fetch_symtab () {
     17     filename=$1
     18 
     19     if [ ! -r $filename ]; then
     20 	return
     21     fi
     22 
     23     if $verbose; then
     24 	echo "Checking $filename..."
     25     fi
     26 
     27     #
     28     # Unfortunately, "nm --defined" is a GNU-extension.  For portability,
     29     # build the list of defined symbols by hand.
     30     #
     31     symtab=`nm -g $filename`
     32     saved_IFS="$IFS"
     33     IFS=""
     34     undef=`nm -g -u $filename`
     35     for line in $undef; do
     36 	symtab=`echo "$symtab" | grep -v "^${line}"\$`
     37     done;
     38     IFS="$saved_IFS"
     39 }
     40 
     41 ignore () {
     42     sym=$1
     43     symtab=`echo "$symtab" | grep -v " ${sym}\$"`
     44 }
     45 
     46 match () {
     47     sym=$1
     48     if `echo "$symtab" | grep -q " ${sym}\$"`; then
     49 	symtab=`echo "$symtab" | grep -v " ${sym}\$"`
     50     else
     51 	echo "  ERROR: Symbol \"$sym\" missing."
     52 	num_errors=`expr $num_errors + 1`
     53     fi
     54 }
     55 
     56 #
     57 # Filter out miscellaneous symbols that get defined by the
     58 # linker for each shared object.
     59 #
     60 filter_misc () {
     61     ignore _DYNAMIC
     62     ignore _GLOBAL_OFFSET_TABLE_
     63     ignore __bss_start
     64     ignore _edata
     65     ignore _end
     66     ignore _Uelf32_get_proc_name
     67     ignore _Uelf32_valid_object
     68     ignore _Uelf64_get_proc_name
     69     ignore _Uelf64_valid_object
     70     ignore _U.*debug_level
     71     ignore ICRT.INTERNAL	# ICC 8.x defines this
     72 
     73     # Ignore symbols generated by the ARM Linux default linker script.
     74     # For details see the binutils sources (src/ld/emulparams/armelf_linux.sh).
     75     if [ ${plat} = "arm" ]; then
     76 	ignore __bss_start__
     77 	ignore __bss_end__
     78 	ignore __end__
     79 	ignore _bss_end__
     80     fi
     81 
     82     if [ ${plat} = "mips" ]; then
     83 	ignore _fbss
     84 	ignore _fdata
     85 	ignore _ftext
     86 	ignore _gp
     87     fi
     88 }
     89 
     90 check_local_unw_abi () {
     91     match _UL${plat}_create_addr_space
     92     match _UL${plat}_destroy_addr_space
     93     match _UL${plat}_get_fpreg
     94     match _UL${plat}_get_proc_info
     95     match _UL${plat}_get_proc_info_by_ip
     96     match _UL${plat}_get_proc_name
     97     match _UL${plat}_get_reg
     98     match _UL${plat}_get_save_loc
     99     match _UL${plat}_init_local
    100     match _UL${plat}_init_remote
    101     match _UL${plat}_is_signal_frame
    102     match _UL${plat}_handle_signal_frame
    103     match _UL${plat}_local_addr_space
    104     match _UL${plat}_resume
    105     match _UL${plat}_set_caching_policy
    106     match _UL${plat}_set_reg
    107     match _UL${plat}_set_fpreg
    108     match _UL${plat}_step
    109 
    110     match _U${plat}_flush_cache
    111     match _U${plat}_get_accessors
    112     match _U${plat}_getcontext
    113     match _U${plat}_regname
    114     match _U${plat}_strerror
    115 
    116     match _U_dyn_cancel
    117     match _U_dyn_info_list_addr
    118     match _U_dyn_register
    119 
    120     match unw_backtrace
    121     match backtrace
    122 
    123     case ${plat} in
    124 	arm)
    125 	    match _U${plat}_get_elf_image
    126 	    match _U${plat}_is_fpreg
    127 	    match _UL${plat}_search_unwind_table
    128 	    match _UL${plat}_dwarf_search_unwind_table
    129 	    match _UL${plat}_dwarf_find_unwind_table
    130 	    ;;
    131 	hppa)
    132 	    match _UL${plat}_dwarf_search_unwind_table
    133 	    match _UL${plat}_dwarf_find_unwind_table
    134 	    match _U${plat}_get_elf_image
    135 	    match _U${plat}_setcontext
    136 	    ;;
    137 	ia64)
    138 	    match _UL${plat}_search_unwind_table
    139 	    match _U${plat}_get_elf_image
    140 	    ;;
    141 	x86)
    142 	    match _U${plat}_get_elf_image
    143 	    match _U${plat}_is_fpreg
    144 	    match _UL${plat}_dwarf_search_unwind_table
    145 	    match _UL${plat}_dwarf_find_unwind_table
    146 	    ;;
    147 	x86_64)
    148 	    match _U${plat}_get_elf_image
    149 	    match _U${plat}_is_fpreg
    150 	    match _UL${plat}_dwarf_search_unwind_table
    151 	    match _UL${plat}_dwarf_find_unwind_table
    152 	    match _U${plat}_setcontext
    153 	    ;;
    154 	ppc*)
    155 	    match _U${plat}_get_func_addr
    156 	    match _U${plat}_get_elf_image
    157 	    match _U${plat}_is_fpreg
    158 	    match _UL${plat}_dwarf_search_unwind_table
    159 	    match _UL${plat}_dwarf_find_unwind_table
    160 	    ;;
    161 	*)
    162 	    match _U${plat}_is_fpreg
    163 	    match _UL${plat}_dwarf_search_unwind_table
    164 	    match _UL${plat}_dwarf_find_unwind_table
    165 	    ;;
    166     esac
    167 
    168     if [ x@enable_debug_frame@ = xyes ]; then
    169 	match _UL${plat}_dwarf_find_debug_frame
    170     fi
    171 
    172 }
    173 
    174 check_generic_unw_abi () {
    175     match _U${plat}_create_addr_space
    176     match _U${plat}_destroy_addr_space
    177     match _U${plat}_flush_cache
    178     match _U${plat}_get_accessors
    179     match _U${plat}_get_fpreg
    180     match _U${plat}_get_proc_info
    181     match _U${plat}_get_proc_info_by_ip
    182     match _U${plat}_get_proc_name
    183     match _U${plat}_get_reg
    184     match _U${plat}_get_save_loc
    185     match _U${plat}_init_local
    186     match _U${plat}_init_remote
    187     match _U${plat}_is_signal_frame
    188     match _U${plat}_handle_signal_frame
    189     match _U${plat}_local_addr_space
    190     match _U${plat}_regname
    191     match _U${plat}_resume
    192     match _U${plat}_set_caching_policy
    193     match _U${plat}_set_fpreg
    194     match _U${plat}_set_reg
    195     match _U${plat}_step
    196     match _U${plat}_strerror
    197 
    198     case ${plat} in
    199 	arm)
    200 	    match _U${plat}_is_fpreg
    201 	    match _U${plat}_get_elf_image
    202 	    match _U${plat}_search_unwind_table
    203 	    match _U${plat}_dwarf_search_unwind_table
    204 	    match _U${plat}_dwarf_find_unwind_table
    205 	    ;;
    206 	hppa)
    207 	    match _U${plat}_dwarf_search_unwind_table
    208 	    match _U${plat}_dwarf_find_unwind_table
    209 	    match _U${plat}_get_elf_image
    210 	    ;;
    211 	ia64)
    212 	    match _U${plat}_search_unwind_table
    213 	    match _U${plat}_find_dyn_list
    214 	    if [ $plat = $build_plat ]; then
    215 		match _U${plat}_get_elf_image
    216 		case $os in
    217 		    linux*)
    218 			match _U${plat}_get_kernel_table
    219 			;;
    220 		esac
    221 	    fi
    222 	    ;;
    223 	x86)
    224 	    match _U${plat}_get_elf_image
    225 	    match _U${plat}_is_fpreg
    226 	    match _U${plat}_dwarf_search_unwind_table
    227 	    match _U${plat}_dwarf_find_unwind_table
    228 	    ;;
    229 	x86_64)
    230 	    match _U${plat}_get_elf_image
    231 	    match _U${plat}_is_fpreg
    232 	    match _U${plat}_dwarf_search_unwind_table
    233 	    match _U${plat}_dwarf_find_unwind_table
    234 	    ;;
    235 	ppc*)
    236 	    match _U${plat}_get_elf_image
    237 	    match _U${plat}_get_func_addr
    238 	    match _U${plat}_is_fpreg
    239 	    match _U${plat}_dwarf_search_unwind_table
    240 	    match _U${plat}_dwarf_find_unwind_table
    241 	    ;;
    242 	*)
    243 	    match _U${plat}_is_fpreg
    244 	    match _U${plat}_dwarf_search_unwind_table
    245 	    match _U${plat}_dwarf_find_unwind_table
    246 	    ;;
    247     esac
    248 
    249     if [ x@enable_debug_frame@ = xyes ]; then
    250 	match _U${plat}_dwarf_find_debug_frame
    251     fi
    252 }
    253 
    254 check_cxx_abi () {
    255     match _Unwind_Backtrace
    256     match _Unwind_DeleteException
    257     match _Unwind_FindEnclosingFunction
    258     match _Unwind_ForcedUnwind
    259     match _Unwind_GetBSP
    260     match _Unwind_GetCFA
    261     match _Unwind_GetDataRelBase
    262     match _Unwind_GetGR
    263     match _Unwind_GetIP
    264     match _Unwind_GetIPInfo
    265     match _Unwind_GetLanguageSpecificData
    266     match _Unwind_GetRegionStart
    267     match _Unwind_GetTextRelBase
    268     match _Unwind_RaiseException
    269     match _Unwind_Resume
    270     match _Unwind_Resume_or_Rethrow
    271     match _Unwind_SetGR
    272     match _Unwind_SetIP
    273     match __libunwind_Unwind_Backtrace
    274     match __libunwind_Unwind_DeleteException
    275     match __libunwind_Unwind_FindEnclosingFunction
    276     match __libunwind_Unwind_ForcedUnwind
    277     match __libunwind_Unwind_GetBSP
    278     match __libunwind_Unwind_GetCFA
    279     match __libunwind_Unwind_GetDataRelBase
    280     match __libunwind_Unwind_GetGR
    281     match __libunwind_Unwind_GetIP
    282     match __libunwind_Unwind_GetIPInfo
    283     match __libunwind_Unwind_GetLanguageSpecificData
    284     match __libunwind_Unwind_GetRegionStart
    285     match __libunwind_Unwind_GetTextRelBase
    286     match __libunwind_Unwind_RaiseException
    287     match __libunwind_Unwind_Resume
    288     match __libunwind_Unwind_Resume_or_Rethrow
    289     match __libunwind_Unwind_SetGR
    290     match __libunwind_Unwind_SetIP
    291     case $os in
    292 	linux*)
    293 	    # needed only for Intel 8.0 bug-compatibility
    294 	    match _ReadSLEB
    295 	    match _ReadULEB
    296 	    ;;
    297     esac
    298 }
    299 
    300 check_empty () {
    301     if [ -n "$symtab" ]; then
    302 	printf "  ERROR: Extraneous symbols:\n$symtab\n"
    303 	num_errors=`expr $num_errors + 1`
    304     fi
    305 }
    306 
    307 if [ $plat = $build_plat ]; then
    308     fetch_symtab $LIBUNWIND
    309     filter_misc
    310     check_local_unw_abi
    311     if [ x@enable_cxx_exceptions@ = xyes ]; then
    312       check_cxx_abi
    313     fi
    314     check_empty
    315 fi
    316 
    317 fetch_symtab $LIBUNWIND_GENERIC
    318 filter_misc
    319 check_generic_unw_abi
    320 check_empty
    321 
    322 if [ $num_errors -gt 0 ]; then
    323     echo "FAILURE: Detected $num_errors errors"
    324     exit 1
    325 fi
    326 
    327 if $verbose; then
    328     echo "  SUCCESS: all checks passed"
    329 fi
    330 exit 0
    331