2019-08-30 15:22:54 +03:00
#!/usr/bin/env python
#
# Copyright (C) 2012-2019 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see
# <http://www.gnu.org/licenses/>.
from __future__ import print_function
import re
import subprocess
import sys
if len ( sys . argv ) < 3 :
print ( " syntax: %s SYMFILE ELFLIB(S) " % sys . argv [ 0 ] , file = sys . stderr )
symfile = sys . argv [ 1 ]
elflibs = sys . argv [ 2 : ]
wantsyms = { }
gotsyms = { }
ret = 0
with open ( symfile , " r " ) as fh :
for line in fh :
line = line . strip ( )
2019-11-20 22:10:13 +03:00
if " { " in line :
2019-08-30 15:22:54 +03:00
continue
2019-11-20 22:10:13 +03:00
if " } " in line :
2019-08-30 15:22:54 +03:00
continue
if line in [ " global: " , " local: " ] :
continue
if line == " " :
continue
if line [ 0 ] == ' # ' :
continue
2019-11-20 22:10:13 +03:00
if " * " in line :
2019-08-30 15:22:54 +03:00
continue
line = line . strip ( " ; " )
if line in wantsyms :
2019-11-25 18:33:53 +03:00
print ( " Symbol %s is listed twice " % line , file = sys . stderr )
2019-08-30 15:22:54 +03:00
ret = 1
else :
wantsyms [ line ] = True
for elflib in elflibs :
nm = subprocess . Popen ( [ " nm " , elflib ] , shell = False ,
stdout = subprocess . PIPE ) . stdout
for line in nm :
line = line . decode ( " utf-8 " )
symmatch = re . search ( r ''' ^ \ S+ \ s(?:[TBD]) \ s( \ S+) \ s*$ ''' , line )
if symmatch is None :
continue
gotsyms [ symmatch . group ( 1 ) ] = True
for sym in wantsyms . keys ( ) :
if sym in gotsyms :
continue
print ( " Expected symbol ' %s ' is not in ELF library " % sym , file = sys . stderr )
ret = 1
sys . exit ( ret )