2222import subprocess
2323from typing import Final , Sequence
2424
25- _LD_PATH = "/usr/bin/ld .so.2"
26- _LD_PATH : Final [pathlib .Path ] = pathlib .Path ("/lib64/ld-linux-x86-64.so.2" )
25+ LD_BINARY_NAME : Final [ str ] = "ld-linux-x86-64 .so.2"
26+ _LD_BINARY_PATH : Final [pathlib .Path ] = pathlib .Path ("/lib64" ) / LD_BINARY_NAME
2727
2828
2929@dataclasses .dataclass (frozen = True )
@@ -45,14 +45,19 @@ def _parse_ld_trace_output(output: str) -> Sequence[SharedLibrary]:
4545 # lib foo.so => /tmp/sharedlib/lib foo.so (0x00007f76b9367000)
4646 # libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f76b9157000)
4747 # /lib64/ld-linux-x86-64.so.2 (0x00007f76b9379000)
48+ # The last line can also be:
49+ # /grte/lib64/lib64/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2
50+ # (0x00007f76b9379000)
4851 #
4952 # The lines that do not have a => should be skipped.
50- # The dynamic linker should always be copied.
53+ # The dynamic linker should always be copied AND have its executable bit set .
5154 # The lines that have a => could contain a space, but we copy whatever is on
5255 # the right side of the =>, removing the load address.
53- shared_libraries = [SharedLibrary (name = "ld.so" , path = _LD_PATH )]
56+ shared_libraries = [SharedLibrary (name = LD_BINARY_NAME , path = _LD_BINARY_PATH )]
5457 for lib_name , lib_path in re .findall (r"(\S+) => .*?(\S+) \(" , output ):
5558 lib_path = pathlib .Path (lib_path )
59+ if lib_path == _LD_BINARY_PATH :
60+ continue
5661 shared_libraries .append (SharedLibrary (name = lib_name , path = lib_path ))
5762
5863 return shared_libraries
@@ -67,7 +72,7 @@ def get_shared_libraries(
6772 env ["LD_BIND_NOW" ] = "1"
6873
6974 result = subprocess .run (
70- [_LD_PATH , binary_path ],
75+ [_LD_BINARY_PATH , binary_path ],
7176 capture_output = True ,
7277 env = env ,
7378 check = True ,
0 commit comments