| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #!/bin/bash
- if [ "$#" -ne 2 ]; then
- echo "Usage: $0 old_library.so new_library.so"
- exit 1
- fi
- OLD_LIB=$1
- NEW_LIB=$2
- OLD_FUNCS=_old_funcs.txt
- NEW_FUNCS=_new_funcs.txt
- OLD_VARS=_old_vars.txt
- NEW_VARS=_new_vars.txt
- # Extract function symbols from the old and new libraries
- nm -C --defined-only $OLD_LIB | c++filt | awk '$2 ~ /[TW]/ {print substr($0, index($0,$3))}' | sort > $OLD_FUNCS
- nm -C --defined-only $NEW_LIB | c++filt | awk '$2 ~ /[TW]/ {print substr($0, index($0,$3))}' | sort > $NEW_FUNCS
- # Extract variable symbols from the old and new libraries
- nm -C --defined-only $OLD_LIB | c++filt | awk '$2 ~ /[BDG]/ {print substr($0, index($0,$3))}' | sort > $OLD_VARS
- nm -C --defined-only $NEW_LIB | c++filt | awk '$2 ~ /[BDG]/ {print substr($0, index($0,$3))}' | sort > $NEW_VARS
- # Initialize error flag and message
- error_flag=0
- error_message=""
- # Check for removed function symbols
- removed_funcs=$(comm -23 $OLD_FUNCS $NEW_FUNCS)
- if [ -n "$removed_funcs" ]; then
- error_flag=1
- error_message+="[Removed Functions]\n$removed_funcs\n"
- fi
- # Check for removed variable symbols
- removed_vars=$(comm -23 $OLD_VARS $NEW_VARS)
- if [ -n "$removed_vars" ]; then
- error_flag=1
- error_message+="[Removed Variables]\n$removed_vars\n"
- fi
- # Check for added variable symbols
- added_vars=$(comm -13 $OLD_VARS $NEW_VARS)
- if [ -n "$added_vars" ]; then
- error_flag=1
- error_message+="[Added Variables]\n$added_vars\n"
- fi
- # Remove temporary files
- rm -f $NEW_FUNCS $OLD_FUNCS $OLD_VARS $NEW_VARS
- # Display error messages if any
- if [ "$error_flag" -eq 1 ]; then
- echo -e "$error_message"
- echo "ABI compatibility check failed."
- exit 1
- fi
- echo "ABI compatibility check passed: No variable symbols were removed or added, and no function symbols were removed."
- exit 0
|