blob: 68a139e76007c0210a155d35ee4809be500c907a [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2015 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tool to check if a glibc binary has a valid NEEDED order."""
import os
import re
import subprocess
import sys
def Check(filename):
lines = subprocess.check_output(
[os.environ.get('OBJDUMP', 'objdump'), '-p', filename]).splitlines()
needed = [i for i in lines if 'NEEDED' in i]
names = [re.match('[ ]+NEEDED[ ]+(.*)', i).group(1) for i in needed]
pthread = -1
nacl_io = -1
nacl_spawn = -1
for i, name in enumerate(names):
if nacl_io < 0 and name == 'libnacl_io.so':
nacl_io = i
elif nacl_spawn < 0 and name == 'libnacl_spawn.so':
nacl_spawn = i
elif pthread < 0 and name.startswith('libpthread.so'):
pthread = i
if pthread != -1 and (pthread < nacl_io or pthread < nacl_spawn):
print 'Executable %s has bad NEEDED order: %s' % (filename, ' '.join(names))
return 1
return 0
if __name__ == '__main__':
sys.exit(Check(sys.argv[1]))