2
0

SWDEV-427268 SWDEV-427256 : Removing dependency with patchelf completely

Change-Id: I71ccebdbbd9b3c79ea8412acd54a71a96af3e26f
Este cometimento está contido em:
Nirmal Unnikrishnan
2023-10-18 17:23:42 -05:00
ascendente d448048fa7
cometimento 1544e398c6
2 ficheiros modificados com 18 adições e 29 eliminações
-2
Ver ficheiro
@@ -174,14 +174,12 @@ set ( CPACK_RPM_FILE_NAME "RPM-DEFAULT" )
set ( CPACK_DEBIAN_PACKAGE_DEPENDS ${DEB_DEPENDS_STRING} )
set ( CPACK_DEBIAN_ASAN_PACKAGE_DEPENDS ${CORE_TARGET} )
set ( CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/RadeonOpenCompute/ROCm" )
set ( CPACK_DEBIAN_PACKAGE_RECOMMENDS "patchelf" )
set ( CPACK_DEBIAN_RUNTIME_PACKAGE_CONTROL_EXTRA "${BUILD_DIR}/postinst;${BUILD_DIR}/prerm" )
## RPM package specific variables
set ( CPACK_RPM_PACKAGE_REQUIRES ${RPM_DEPENDS_STRING} )
set ( CPACK_RPM_ASAN_PACKAGE_REQUIRES ${CORE_TARGET} )
set ( CPACK_RPM_PACKAGE_LICENSE "MIT" )
set ( CPACK_RPM_PACKAGE_SUGGESTS "patchelf" )
set ( CPACK_RPM_RUNTIME_POST_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_BINARY_DIR}/postinst" )
set ( CPACK_RPM_RUNTIME_POST_UNINSTALL_SCRIPT_FILE "${CMAKE_CURRENT_BINARY_DIR}/prerm" )
+18 -27
Ver ficheiro
@@ -35,29 +35,17 @@ try:
from elftools.elf.elffile import ELFFile
from elftools.elf.dynamic import DynamicSection
from elftools.common.exceptions import ELFError
from elftools.elf.dynamic import ENUM_D_TAG
except ImportError:
print("Error : pyelftools failed to import.\n"
"Run \'pip3 install pyelftools\' to install the prerequisite\n")
# Function remove the runpath from the binary
def remove_runpath(filename) :
''' Remove the DT_RUNPATH tag from filename'''
REMOVE_RPATH_COMMAND = ['patchelf', '--remove-rpath', filename]
print("Executing the command : ", REMOVE_RPATH_COMMAND)
subprocess.run(REMOVE_RPATH_COMMAND, check=True)
def add_rpath(filename, runpath) :
''' Use runpath and add it as DT_PATH tag in filename'''
ADD_RPATH_COMMAND = ['patchelf', '--force-rpath', '--set-rpath', runpath, filename]
print("Executing the command : ", ADD_RPATH_COMMAND)
subprocess.run(ADD_RPATH_COMMAND, check=True)
def update_rpath(search_path, excludes) :
''' Function helps to change DT_RUNPATH in libraries and binaries in search_path to DT_RPATH.
Its done with the following steps :
1. Check all if the file is an ELF except in excludes folder
2. Read and store the DT_RUNPATH from the binaries/libraries.
3. Delete DT_RUNPATH and readd it as DT_RPATH '''
2. Find the DT_RUNPATH tag and its offset from file.
3. Toggle the DT_RUNPATH(0x1d) tag byte to DT_RPATH(0xf) and write back to file '''
for path, dirs, files in os.walk(search_path, topdown=True, followlinks=True):
dirs[:] = [d for d in dirs if d not in excludes]
print( dirs )
@@ -66,19 +54,22 @@ def update_rpath(search_path, excludes) :
print("Opening file ", filename)
# Open the file and check if its ELF file
try :
with open(filename, 'rb') as file:
with open(filename, 'rb+') as file:
elffile = ELFFile(file)
for section in elffile.iter_sections():
if not isinstance(section, DynamicSection):
continue
for tag in section.iter_tags():
if tag.entry.d_tag == 'DT_RUNPATH':
runpath = tag.runpath
print(runpath)
remove_runpath(filename)
add_rpath(filename, runpath)
break
break
# Find the dynamic section and look for DT_RUNPATH tag
section = elffile.get_section_by_name('.dynamic')
if not section: break
n = 0
for tag in section.iter_tags():
# DT_RUNPATH tag found. Toggle the byte to DT_RPATH
if tag.entry.d_tag == 'DT_RUNPATH':
offset = section.header.sh_offset + n* section._tagsize
section.stream.seek(offset)
section.stream.write(bytes([ENUM_D_TAG['DT_RPATH']])) # DT_PATH
print("DT_RUNPATH changed to DT_RPATH ")
break
# DT_RUNPATH tag not found. Loop to the next tag
n = n + 1
except ELFError:
print("Discarding file as its not an ELF file", filename)
continue