Allow binary relocation of strings in relative binaries (#13725)

Binaries with relative RPATHS currently do not relocate strings
hard-coded in binaries

This PR extends the best-effort relocation of strings hard-coded
in binaries to those whose RPATHs have been relativized.
This commit is contained in:
Greg Becker 2019-11-13 16:03:35 -08:00 committed by Peter Scheibel
parent dc36b4737d
commit 43b0356e14
2 changed files with 25 additions and 15 deletions

View File

@ -536,7 +536,22 @@ def relocate_package(workdir, spec, allow_root):
newprefix=new_prefix)
# If the binary files in the package were not edited to use
# relative RPATHs, then the RPATHs need to be relocated
if not rel:
if rel:
if old_path != new_path:
files_to_relocate = list(filter(
lambda pathname: not relocate.file_is_relocatable(
pathname, paths_to_relocate=[old_path, old_prefix]),
map(lambda filename: os.path.join(workdir, filename),
buildinfo['relocate_binaries'])))
if len(old_path) < len(new_path) and files_to_relocate:
tty.debug('Cannot do a binary string replacement with padding '
'for package because %s is longer than %s.' %
(new_path, old_path))
else:
for path_name in files_to_relocate:
relocate.replace_prefix_bin(path_name, old_path, new_path)
else:
path_names = set()
for filename in buildinfo['relocate_binaries']:
path_name = os.path.join(workdir, filename)

View File

@ -651,7 +651,8 @@ def is_relocatable(spec):
return True
def file_is_relocatable(file):
def file_is_relocatable(
file, paths_to_relocate=[spack.store.layout.root, spack.paths.prefix]):
"""Returns True if the file passed as argument is relocatable.
Args:
@ -704,18 +705,12 @@ def file_is_relocatable(file):
if idpath is not None:
set_of_strings.discard(idpath)
if any(spack.store.layout.root in x for x in set_of_strings):
for path_to_relocate in paths_to_relocate:
if any(path_to_relocate in x for x in set_of_strings):
# One binary has the root folder not in the RPATH,
# meaning that this spec is not relocatable
msg = 'Found "{0}" in {1} strings'
tty.debug(msg.format(spack.store.layout.root, file))
return False
if any(spack.paths.prefix in x for x in set_of_strings):
# One binary has the root folder not in the RPATH,
# meaning that this spec is not relocatable
msg = 'Found "{0}" in {1} strings'
tty.debug(msg.format(spack.paths.prefix, file))
tty.debug(msg.format(path_to_relocate, file))
return False
return True