Allow binary relocation of strings in relative binaries (#13724)
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
					Greg Becker
				
			
				
					committed by
					
						 Peter Scheibel
						Peter Scheibel
					
				
			
			
				
	
			
			
			 Peter Scheibel
						Peter Scheibel
					
				
			
						parent
						
							b4501c4586
						
					
				
				
					commit
					b280034380
				
			| @@ -534,7 +534,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) | ||||
|   | ||||
| @@ -637,7 +637,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: | ||||
| @@ -684,19 +685,13 @@ 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): | ||||
|         # 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)) | ||||
|         return False | ||||
|     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(path_to_relocate, file)) | ||||
|             return False | ||||
|  | ||||
|     return True | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user