#!/usr/bin/python
# Usage: $0 file1 file2 ....
#
# Given binary files, remove all rpath entries from them containing
# $ORIGIN. Other rpath entries are not modified
import subprocess;
import sys;
def print_usage(name):
print '''Usage: %s file1 file2 ....
Given binary files, remove all rpath entries from them containing
$ORIGIN. Other rpath entries are not modified''' % (name,)
def call(args):
pop = subprocess.Popen(args, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = pop.communicate()
if (len(stderr.strip())) != 0:
print stderr
if pop.returncode != 0:
raise OSError('Error calling %s' % (str(args),))
return stdout
def check_chrpath_present():
try:
print(call(['/usr/bin/chrpath', '-v']))
return True
except OSError:
return False
def main(args):
binaries = args[1:]
if len(binaries) == 0:
print_usage(args[0])
return 1
if not check_chrpath_present():
print('Could not execute "chrpath". Is it installed?')
return 1
for binary in binaries:
try:
rpath_output = call(['chrpath', '-l', binary])
except OSError:
continue
#print '"' + rpath_output + '"'
# the output is "file: RUNPATH=path1:path2:path3\n"
rpath_output = rpath_output.strip()
start = rpath_output.find('RPATH=')
rpath = rpath_output[start+len('RPATH='):]
rpath_parts = rpath.split(':')
modified_rpath = ''
for part in rpath_parts:
if not '$ORIGIN' in part:
modified_rpath = modified_rpath + ':' + part
# shave off the last ':'
modified_rpath = modified_rpath[1:]
#print '"' + modified_rpath + '"'
if len(modified_rpath) == 0:
call(['chrpath', '-d', binary])
print '%s: Deleted RPATH' % (binary,)
else:
call(['chrpath', '-r', modified_rpath, binary])
print '%s: RPATH=%s' % (binary,modified_rpath)
return 0
if __name__ == '__main__':
exit(main(sys.argv))