From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dilbert.mork.no (dilbert.mork.no [IPv6:2a01:4f9:c010:a439::d]) by sourceware.org (Postfix) with ESMTPS id 24F943894C27 for ; Fri, 21 Jun 2024 07:56:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 24F943894C27 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=mork.no Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=miraculix.mork.no ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 24F943894C27 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a01:4f9:c010:a439::d ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1718956607; cv=none; b=FY69atxqPaw+S1PTgiUDpie3+oPrCvQo8vEr8H0tnib9fNwETTVRQjLXrp8sIe+fc70wmOHo+d4IUu9s00aQcyiJfNGYZJFYhBo+rJyvd0teD0Gj5aEIcIrH6cC2syIAMTNZ9ZzO+w3jxDOOE/c7eu0MLmG39wB7gtOyhYno79Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1718956607; c=relaxed/simple; bh=eNhwePu/NcB+d5TIv3KS7ADlM0Hwd+SZH09/RGLa4vI=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=gmJdLng7JEbI2emd985m0BQkC0V7FT1HQba5wYzXmdRi+CnwoKLBt6upAEYRkpU27mLD3mBGD5UdFMashfyHmY0NjyS1h8eiA4LM7OxjN9Af11fxyGPRs/jW5qIslk3gj+Nu+hpjLLNYgqDG5mvFTdMcudhMyQjPf0ekHPrKfjw= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from canardo.dyn.mork.no ([IPv6:2a01:799:10da:6900:0:0:0:1]) (authenticated bits=0) by dilbert.mork.no (8.17.1.9/8.17.1.9) with ESMTPSA id 45L7ucU63703624 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=OK); Fri, 21 Jun 2024 08:56:40 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mork.no; s=b; t=1718956598; bh=bK0vHGmAyg5DUGUV4nAXQhXHjjCXqZxIns/3gQ+z47c=; h=From:To:Cc:Subject:Date:Message-ID:From; b=eR+8DtFZ2+xcGdWV2P9/aF/1URFJIadulfPMigFqO+idK0sqtFrnj/goeAl94MsV1 61ZcOPH40TwHGosObf0vBo8JIgi/TEoMl/MvNRDfyO5HHvRToZ5Vzf75mvjpHAdqi8 k8+UIEyqycl/1Ju7+5AP3RumAtZE3qUBfQuC/Qm0= Received: from miraculix.mork.no ([IPv6:2a01:799:10da:690a:d43d:737:5289:b66f]) (authenticated bits=0) by canardo.dyn.mork.no (8.17.1.9/8.17.1.9) with ESMTPSA id 45L7ucZe1126004 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=OK); Fri, 21 Jun 2024 09:56:38 +0200 Received: (nullmailer pid 2097250 invoked by uid 1000); Fri, 21 Jun 2024 07:56:38 -0000 From: =?utf-8?Q?Bj=C3=B8rn_Mork?= To: libc-help@sourceware.org Cc: Peter O'Connor Subject: What's the point having GLIBC_ABI_DT_RELR? Organization: m Date: Fri, 21 Jun 2024 09:56:38 +0200 Message-ID: <875xu2bufd.fsf@miraculix.mork.no> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Virus-Scanned: clamav-milter 1.0.3 at canardo X-Virus-Status: Clean X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: So I stumbled across the DT_RELR without GLIBC_ABI_DT_RELR thing as an end user, and couldn't figure out what the point was. I'd really appreciate it if anyone took the time to spoon feed me. Googling for an answer I found this old question from Peter, which is a much better summary of the situation than I'm able to give: https://sourceware.org/pipermail/libc-alpha/2022-March/136773.html But I still could not find an answer. Isn't the whole GLIBC_ABI_DT_RELR test just unnecessarily preventing glibc from loading libraries with DT_RELR? Any glibc version testing for it will also support DT_RELR. So it would have worked fine if it weren't for the test. Looks like unnecessary forced breakage - there must be something I'm missing. But what? I realize that the reason I'm here asking. isn't going to win me any points. And I might lose some readers now. But, like many other end users, I am using an RPi4 running a standard Debian stable installation with Kodi as a media center. Which quickly ends up with a "wish" for DRM support. Not that I really want DRM of course, but I would like to watch the content and I am pragmatic enough to accept that's how stupid the world is. So the current pragmatic DRM solution for an aarch64 system is to fetch a libwidevinecdm.so binary from a Chrome OS rescue image and dload that. Simple enough. But that doesn't work on a plain Debian installation, because: bjorn@brego:~$ ldd /tmp/libwidevinecdm.so=20 /tmp/libwidevinecdm.so: error while loading shared libraries: /tmp/libwide= vinecdm.so: DT_RELR without GLIBC_ABI_DT_RELR dependency Google pointed me to a terrible hack as a "solution": disabling the test specifically for the "libwidevinecdm.so" binary. Patch example linked from https://github.com/xbmc/inputstream.adaptive/wiki/Widevine-ARM64-support This seems to be implemented by default in some media center focused distros. I haven't asked, but I'm pretty sure something like that is out of the question for Debian. I can certainly build my own hacked glibc package and be happy wth that. But I would prefer to avoid it. And I do worry about other Debian (or any generic distro) end users. There should be a better solution than having every end user patch their glibc package, or install some distro with an unknown number of similar hacks already applied. So I come here to ask if the GLIBC_ABI_DT_RELR thing really is in the best interest of users? And if not, if it can be removed or maybe demoted to a warning? Personally I replaced the widevine specific hack with this, so that I would still notice that this problem is there and being worked around: --- a/elf/dl-version.c 2022-07-29 22:03:09.000000000 +0000 +++ b/elf/dl-version.c 2024-06-19 13:05:51.609950787 +0000 @@ -374,12 +374,8 @@ { const char *name =3D strtab + d->d_un.d_val; if (strncmp (name, "libc.so.", 8) =3D=3D 0) - { - _dl_exception_create - (&exception, DSO_FILENAME (map->l_name), - N_("DT_RELR without GLIBC_ABI_DT_RELR dependency")); - goto call_error; - } + _dl_error_printf ("%s: DT_RELR without GLIBC_ABI_DT_RELR depe= ndency\n", + DSO_FILENAME (map->l_name)); } } =20 Which makes the library load and work fine while providing a visible indication of the unexpected format: bjorn@rattata:~$ ldd /tmp/libwidevinecdm.so=20 /tmp/libwidevinecdm.so: DT_RELR without GLIBC_ABI_DT_RELR dependency linux-vdso.so.1 (0x0000ffffbf0d8000) libdl.so.2 =3D> /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffffbd8900= 00) libpthread.so.0 =3D> /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000= ffffbd860000) libnspr4.so =3D> /lib/aarch64-linux-gnu/libnspr4.so (0x0000ffffbd80= 0000) libm.so.6 =3D> /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffffbd760000) libc.so.6 =3D> /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffbd5b0000) /lib/ld-linux-aarch64.so.1 (0x0000ffffbf09b000) But the question still remains: What does this test actually achieve? Some details about the binary below. The copy I got was automatically downloaded by the kodi-inputstream-adaptive plugin, as packaged by Debian (version 20.3.18+ds-1), after asking me the appropriate questions. bjorn@brego:~$ readelf -d /tmp/libwidevinecdm.so=20 Dynamic section at offset 0x9ccc78 contains 34 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libdl.so.2] 0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0] 0x0000000000000001 (NEEDED) Shared library: [libnspr4.so] 0x0000000000000001 (NEEDED) Shared library: [libm.so.6] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x0000000000000001 (NEEDED) Shared library: [ld-linux-aarch64.= so.1] 0x000000000000000e (SONAME) Library soname: [libwidevinecdm.so] 0x000000000000001e (FLAGS) BIND_NOW 0x000000006ffffffb (FLAGS_1) Flags: NOW 0x0000000000000007 (RELA) 0x1d50 0x0000000000000008 (RELASZ) 408 (bytes) 0x0000000000000009 (RELAENT) 24 (bytes) 0x0000000000000024 (RELR) 0x1ee8 0x0000000000000023 (RELRSZ) 536 (bytes) 0x0000000000000025 (RELRENT) 8 (bytes) 0x0000000000000017 (JMPREL) 0x2100 0x0000000000000002 (PLTRELSZ) 3072 (bytes) 0x0000000000000003 (PLTGOT) 0x9de9b8 0x0000000000000014 (PLTREL) RELA 0x0000000000000006 (SYMTAB) 0x298 0x000000000000000b (SYMENT) 24 (bytes) 0x0000000000000005 (STRTAB) 0x15c8 0x000000000000000a (STRSZ) 1927 (bytes) 0x0000000000000004 (HASH) 0x1168 0x0000000000000019 (INIT_ARRAY) 0x9d7a00 0x000000000000001b (INIT_ARRAYSZ) 64 (bytes) 0x000000000000001a (FINI_ARRAY) 0x9d7a40 0x000000000000001c (FINI_ARRAYSZ) 8 (bytes) 0x000000000000000c (INIT) 0x9c7134 0x000000000000000d (FINI) 0x9c714c 0x000000006ffffff0 (VERSYM) 0xfa0 0x000000006ffffffe (VERNEED) 0x10b8 0x000000006fffffff (VERNEEDNUM) 5 0x0000000000000000 (NULL) 0x0 bjorn@brego:~$ readelf -Ws /tmp/libwidevinecdm.so Symbol table '.dynsym' contains 139 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND=20 1: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __register_frame= _info 3: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@G= LIBC_2.17 (2) 4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __deregister_fra= me_info 5: 00000000005c89b4 4 FUNC GLOBAL DEFAULT 14 InitializeCdmMod= ule_4 6: 00000000005c89b8 36 FUNC GLOBAL DEFAULT 14 DeinitializeCdmM= odule 7: 00000000005c89dc 272 FUNC GLOBAL DEFAULT 14 CreateCdmInstance 8: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND __stack_chk_guar= d@GLIBC_2.17 (3) 9: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __stack_chk_fail= @GLIBC_2.17 (2) 10: 00000000005c8aec 12 FUNC GLOBAL DEFAULT 14 GetCdmVersion 11: 00000000005c8af8 8 FUNC GLOBAL DEFAULT 14 VerifyCdmHost_0 12: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __cxa_atexit@GLI= BC_2.17 (2) 13: 0000000000000000 0 FUNC GLOBAL DEFAULT UND memcpy@GLIBC_2.1= 7 (2) 14: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __memcpy_chk@GLI= BC_2.17 (2) 15: 0000000000000000 0 FUNC GLOBAL DEFAULT UND memset@GLIBC_2.1= 7 (2) 16: 0000000000000000 0 FUNC GLOBAL DEFAULT UND bcmp@GLIBC_2.17 = (2) 17: 0000000000000000 0 FUNC GLOBAL DEFAULT UND abort@GLIBC_2.17= (2) 18: 0000000000000000 0 FUNC GLOBAL DEFAULT UND memmove@GLIBC_2.= 17 (2) 19: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strlen@GLIBC_2.1= 7 (2) 20: 0000000000000000 0 FUNC GLOBAL DEFAULT UND memcmp@GLIBC_2.1= 7 (2) 21: 0000000000000000 0 FUNC GLOBAL DEFAULT UND syscall@GLIBC_2.= 17 (2) 22: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __open64_2@GLIBC= _2.17 (2) 23: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strtol@GLIBC_2.1= 7 (2) 24: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_setspeci= fic@GLIBC_2.17 (4) 25: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_key_crea= te@GLIBC_2.17 (4) 26: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_getspeci= fic@GLIBC_2.17 (4) 27: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __errno_location= @GLIBC_2.17 (4) 28: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __vsnprintf_chk@= GLIBC_2.17 (2) 29: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __aarch64_ldadd4= _acq_rel 30: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sched_yield@GLIB= C_2.17 (2) 31: 0000000000000000 0 FUNC GLOBAL DEFAULT UND gettimeofday@GLI= BC_2.17 (2) 32: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sysconf@GLIBC_2.= 17 (2) 33: 0000000000000000 0 FUNC GLOBAL DEFAULT UND munmap@GLIBC_2.1= 7 (2) 34: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mmap64@GLIBC_2.1= 7 (2) 35: 0000000000000000 0 FUNC GLOBAL DEFAULT UND clock_gettime@GL= IBC_2.17 (2) 36: 0000000000000000 0 FUNC GLOBAL DEFAULT UND nanosleep@GLIBC_= 2.17 (2) 37: 0000000000000000 0 FUNC GLOBAL DEFAULT UND getenv@GLIBC_2.1= 7 (2) 38: 0000000000000000 0 FUNC GLOBAL DEFAULT UND fopen64@GLIBC_2.= 17 (2) 39: 0000000000000000 0 FUNC GLOBAL DEFAULT UND fclose@GLIBC_2.1= 7 (2) 40: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strcmp@GLIBC_2.1= 7 (2) 41: 0000000000000000 0 FUNC GLOBAL DEFAULT UND localtime_r@GLIB= C_2.17 (2) 42: 0000000000000000 0 FUNC GLOBAL DEFAULT UND gmtime_r@GLIBC_2= .17 (2) 43: 0000000000000000 0 FUNC GLOBAL DEFAULT UND getauxval@GLIBC_= 2.17 (2) 44: 0000000000000000 0 FUNC GLOBAL DEFAULT UND read@GLIBC_2.17 = (4) 45: 0000000000000000 0 FUNC GLOBAL DEFAULT UND getpid@GLIBC_2.1= 7 (2) 46: 0000000000000000 0 FUNC GLOBAL DEFAULT UND fwrite@GLIBC_2.1= 7 (2) 47: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND stderr@GLIBC_2.1= 7 (2) 48: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __vfprintf_chk@G= LIBC_2.17 (2) 49: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strerror_r@GLIBC= _2.17 (2) 50: 0000000000000000 0 FUNC GLOBAL DEFAULT UND madvise@GLIBC_2.= 17 (2) 51: 0000000000000000 0 FUNC GLOBAL DEFAULT UND write@GLIBC_2.17= (4) 52: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __memset_chk@GLI= BC_2.17 (2) 53: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_create@G= LIBC_2.17 (4) 54: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_attr_des= troy@GLIBC_2.17 (2) 55: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_cond_sig= nal@GLIBC_2.17 (4) 56: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_cond_bro= adcast@GLIBC_2.17 (4) 57: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_cond_wai= t@GLIBC_2.17 (4) 58: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_cond_des= troy@GLIBC_2.17 (2) 59: 0000000000000000 0 FUNC GLOBAL DEFAULT UND fflush@GLIBC_2.1= 7 (2) 60: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND stdin@GLIBC_2.17= (2) 61: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND stdout@GLIBC_2.1= 7 (2) 62: 0000000000000000 0 FUNC GLOBAL DEFAULT UND ungetc@GLIBC_2.1= 7 (2) 63: 0000000000000000 0 FUNC GLOBAL DEFAULT UND getc@GLIBC_2.17 = (2) 64: 0000000000000000 0 FUNC GLOBAL DEFAULT UND uselocale@GLIBC_= 2.17 (2) 65: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __isoc99_vsscanf= @GLIBC_2.17 (2) 66: 0000000000000000 0 FUNC GLOBAL DEFAULT UND newlocale@GLIBC_= 2.17 (2) 67: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strftime_l@GLIBC= _2.17 (2) 68: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mbsrtowcs@GLIBC_= 2.17 (2) 69: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __isoc99_sscanf@= GLIBC_2.17 (2) 70: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __vasprintf_chk@= GLIBC_2.17 (2) 71: 0000000000000000 0 FUNC GLOBAL DEFAULT UND catopen@GLIBC_2.= 17 (2) 72: 0000000000000000 0 FUNC GLOBAL DEFAULT UND catgets@GLIBC_2.= 17 (2) 73: 0000000000000000 0 FUNC GLOBAL DEFAULT UND catclose@GLIBC_2= .17 (2) 74: 0000000000000000 0 FUNC GLOBAL DEFAULT UND freelocale@GLIBC= _2.17 (2) 75: 0000000000000000 0 FUNC GLOBAL DEFAULT UND wcsnrtombs@GLIBC= _2.17 (2) 76: 0000000000000000 0 FUNC GLOBAL DEFAULT UND wcrtomb@GLIBC_2.= 17 (2) 77: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mbsnrtowcs@GLIBC= _2.17 (2) 78: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mbrtowc@GLIBC_2.= 17 (2) 79: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mbtowc@GLIBC_2.1= 7 (2) 80: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __ctype_get_mb_c= ur_max@GLIBC_2.17 (2) 81: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mbrlen@GLIBC_2.1= 7 (2) 82: 0000000000000000 0 FUNC GLOBAL DEFAULT UND wcslen@GLIBC_2.1= 7 (2) 83: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strtoll_l@GLIBC_= 2.17 (2) 84: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strtoull_l@GLIBC= _2.17 (2) 85: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strtof_l@GLIBC_2= .17 (2) 86: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strtod_l@GLIBC_2= .17 (2) 87: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strtold_l@GLIBC_= 2.17 (2) 88: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_mutex_lo= ck@GLIBC_2.17 (4) 89: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_mutex_un= lock@GLIBC_2.17 (4) 90: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_mutex_tr= ylock@GLIBC_2.17 (4) 91: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_mutexatt= r_init@GLIBC_2.17 (4) 92: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_mutex_in= it@GLIBC_2.17 (4) 93: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_mutexatt= r_destroy@GLIBC_2.17 (4) 94: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_mutex_de= stroy@GLIBC_2.17 (4) 95: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_join@GLI= BC_2.17 (4) 96: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_once@GLI= BC_2.17 (4) 97: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strncmp@GLIBC_2.= 17 (2) 98: 0000000000000000 0 FUNC GLOBAL DEFAULT UND exp@GLIBC_2.29 (= 5) 99: 0000000000000000 0 FUNC GLOBAL DEFAULT UND prctl@GLIBC_2.17= (2) 100: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __ctype_b_loc@GL= IBC_2.17 (2) 101: 0000000000000000 0 FUNC GLOBAL DEFAULT UND fcntl64@GLIBC_2.= 28 (6) 102: 0000000000000000 0 FUNC GLOBAL DEFAULT UND dlclose@GLIBC_2.= 17 (7) 103: 0000000000000000 0 FUNC GLOBAL DEFAULT UND dlsym@GLIBC_2.17= (7) 104: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _setjmp@GLIBC_2.= 17 (2) 105: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __longjmp_chk@GL= IBC_2.17 (2) 106: 0000000000000000 0 FUNC GLOBAL DEFAULT UND usleep@GLIBC_2.1= 7 (2) 107: 0000000000000000 0 FUNC GLOBAL DEFAULT UND uname@GLIBC_2.17= (2) 108: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_cond_ini= t@GLIBC_2.17 (2) 109: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_attr_ini= t@GLIBC_2.17 (2) 110: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_attr_set= stacksize@GLIBC_2.17 (4) 111: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_malloc@GL= IBC_2.17 (2) 112: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_calloc@GL= IBC_2.17 (2) 113: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_memalign@= GLIBC_2.17 (2) 114: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_realloc@G= LIBC_2.17 (2) 115: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_free@GLIB= C_2.17 (2) 116: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND program_invocati= on_short_name@GLIBC_2.17 (2) 117: 0000000000000000 0 FUNC GLOBAL DEFAULT UND qsort@GLIBC_2.17= (2) 118: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strchr@GLIBC_2.1= 7 (2) 119: 0000000000000000 0 FUNC GLOBAL DEFAULT UND perror@GLIBC_2.1= 7 (2) 120: 0000000000000000 0 NOTYPE WEAK DEFAULT UND OPENSSL_memory_a= lloc 121: 0000000000000000 0 NOTYPE WEAK DEFAULT UND OPENSSL_memory_f= ree 122: 0000000000000000 0 NOTYPE WEAK DEFAULT UND sdallocx 123: 0000000000000000 0 NOTYPE WEAK DEFAULT UND OPENSSL_memory_g= et_size 124: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_rwlock_i= nit@GLIBC_2.17 (4) 125: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_rwlock_r= dlock@GLIBC_2.17 (4) 126: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_rwlock_w= rlock@GLIBC_2.17 (4) 127: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_rwlock_u= nlock@GLIBC_2.17 (4) 128: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_rwlock_d= estroy@GLIBC_2.17 (4) 129: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __fgets_chk@GLIB= C_2.17 (2) 130: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __aarch64_swp4_a= cq_rel 131: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sem_init@GLIBC_2= .17 (4) 132: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sem_destroy@GLIB= C_2.17 (4) 133: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sem_wait@GLIBC_2= .17 (4) 134: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sem_trywait@GLIB= C_2.17 (4) 135: 0000000000000000 0 FUNC GLOBAL DEFAULT UND sem_post@GLIBC_2= .17 (4) 136: 0000000000000000 0 FUNC GLOBAL DEFAULT UND rand@GLIBC_2.17 = (2) 137: 0000000000000000 0 FUNC GLOBAL DEFAULT UND dl_iterate_phdr@= GLIBC_2.17 (2) 138: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __register_atfor= k@GLIBC_2.17 (2) Let me know if you want other data, or a copy of this binary, or something else. OK, so this problem will most likely go away by itself once Google start liking their libwidevinecdm.so with the GLIBC_ABI_DT_RELR version. Which will solve my problem. But the question remains. Bj=C3=B8rn