diff mbox series

uclibc: add simlinks from libdl/libm/libpthread/librt

Message ID 20200613162001.154280-1-paul@crapouillou.net
State Rejected
Headers show
Series uclibc: add simlinks from libdl/libm/libpthread/librt | expand

Commit Message

Paul Cercueil June 13, 2020, 4:20 p.m. UTC
All the symbols that were previously present in libdl.so.0, libm.so.0,
libpthread.so.0 and librt.so.0 are now all packed within uClibc.

In order to keep binary compatibility with old executables, which were
dynamically linked with one of the libraries above, add symbolic links
to the uClibc shared library.

Signed-off-by: Paul Cercueil <paul@crapouillou.net>
---
 package/uclibc/uclibc.mk | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Yann E. MORIN June 14, 2020, 3 p.m. UTC | #1
Paul, All,

On 2020-06-13 18:20 +0200, Paul Cercueil spake thusly:
> All the symbols that were previously present in libdl.so.0, libm.so.0,
> libpthread.so.0 and librt.so.0 are now all packed within uClibc.
> 
> In order to keep binary compatibility with old executables, which were
> dynamically linked with one of the libraries above, add symbolic links
> to the uClibc shared library.
> 
> Signed-off-by: Paul Cercueil <paul@crapouillou.net>
> ---
>  package/uclibc/uclibc.mk | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/package/uclibc/uclibc.mk b/package/uclibc/uclibc.mk
> index 3ba4589672..73664d5b0b 100644
> --- a/package/uclibc/uclibc.mk
> +++ b/package/uclibc/uclibc.mk
> @@ -424,6 +424,10 @@ define UCLIBC_INSTALL_TARGET_CMDS
>  		RUNTIME_PREFIX=/ \
>  		install_runtime
>  	$(UCLIBC_INSTALL_UTILS_TARGET)
> +	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/libdl.so.0
> +	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/libm.so.0
> +	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/libpthread.so.0
> +	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/librt.so.0

This does not account for external toolchains.

I wonder how good those symlinks are anyway: uClibc has no ABI/API
stability anyway, so there are no guarantee that a program linked
against a version of uClibc will work against another version, or even
the same version that was compiled with another configuration...

And I am not sure we want to condone such a case.

My opinion would be that, if you really need those legacy symlinks,
then you should create them in a post-build script.

I'm leaving this patch opened in patchwork, so other maintainers may
reverse my position.

Regards,
Yann E. MORIN.

>  endef
>  
>  # STATIC has no ld* tools, only getconf
> -- 
> 2.27.0
> 
> _______________________________________________
> buildroot mailing list
> buildroot@busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
Paul Cercueil June 14, 2020, 5:51 p.m. UTC | #2
Hi Yann,

Le dim. 14 juin 2020 à 17:00, Yann E. MORIN <yann.morin.1998@free.fr> 
a écrit :
> Paul, All,
> 
> On 2020-06-13 18:20 +0200, Paul Cercueil spake thusly:
>>  All the symbols that were previously present in libdl.so.0, 
>> libm.so.0,
>>  libpthread.so.0 and librt.so.0 are now all packed within uClibc.
>> 
>>  In order to keep binary compatibility with old executables, which 
>> were
>>  dynamically linked with one of the libraries above, add symbolic 
>> links
>>  to the uClibc shared library.
>> 
>>  Signed-off-by: Paul Cercueil <paul@crapouillou.net>
>>  ---
>>   package/uclibc/uclibc.mk | 4 ++++
>>   1 file changed, 4 insertions(+)
>> 
>>  diff --git a/package/uclibc/uclibc.mk b/package/uclibc/uclibc.mk
>>  index 3ba4589672..73664d5b0b 100644
>>  --- a/package/uclibc/uclibc.mk
>>  +++ b/package/uclibc/uclibc.mk
>>  @@ -424,6 +424,10 @@ define UCLIBC_INSTALL_TARGET_CMDS
>>   		RUNTIME_PREFIX=/ \
>>   		install_runtime
>>   	$(UCLIBC_INSTALL_UTILS_TARGET)
>>  +	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/libdl.so.0
>>  +	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/libm.so.0
>>  +	ln -sf libuClibc-$(UCLIBC_VERSION).so 
>> $(TARGET_DIR)/lib/libpthread.so.0
>>  +	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/librt.so.0
> 
> This does not account for external toolchains.

True.

> I wonder how good those symlinks are anyway: uClibc has no ABI/API
> stability anyway, so there are no guarantee that a program linked
> against a version of uClibc will work against another version, or even
> the same version that was compiled with another configuration...

I didn't encounter any issue, everything works fine as intended. Tested 
with a broad panel of games compiled between 2014.05 and now.

> And I am not sure we want to condone such a case.
> 
> My opinion would be that, if you really need those legacy symlinks,
> then you should create them in a post-build script.

I had them in an overlay, but then everytime I merge upstream/master 
and uclibc gets bumped, my symlinks are stale and I end up with a 
rootfs that can't run the old binaries.

Cheers,
-Paul

> I'm leaving this patch opened in patchwork, so other maintainers may
> reverse my position.
> 
> Regards,
> Yann E. MORIN.
> 
>>   endef
>> 
>>   # STATIC has no ld* tools, only getconf
>>  --
>>  2.27.0
>> 
>>  _______________________________________________
>>  buildroot mailing list
>>  buildroot@busybox.net
>>  http://lists.busybox.net/mailman/listinfo/buildroot
> 
> --
> .-----------------.--------------------.------------------.--------------------.
> |  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' 
> conspiracy: |
> | +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___      
>          |
> | +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  
> There is no  |
> | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   
> conspiracy.  |
> '------------------------------^-------^------------------^--------------------'
Yann E. MORIN June 21, 2020, 8:51 a.m. UTC | #3
Paul, All,

On 2020-06-14 19:51 +0200, Paul Cercueil spake thusly:
> Le dim. 14 juin 2020 à 17:00, Yann E. MORIN <yann.morin.1998@free.fr> a
> écrit :
> >On 2020-06-13 18:20 +0200, Paul Cercueil spake thusly:
> >> All the symbols that were previously present in libdl.so.0, libm.so.0,
> >> libpthread.so.0 and librt.so.0 are now all packed within uClibc.
> >>
> >> In order to keep binary compatibility with old executables, which were
> >> dynamically linked with one of the libraries above, add symbolic links
> >> to the uClibc shared library.
> >This does not account for external toolchains.
[--SNIP--]
> >I wonder how good those symlinks are anyway: uClibc has no ABI/API
> >stability anyway, so there are no guarantee that a program linked
> >against a version of uClibc will work against another version, or even
> >the same version that was compiled with another configuration...

We've discussed this with the other maintainers, and we agree that "we do
not really care about binary-level compatibility, especially with uClibc
where it is anyway not guaranteed" (quoting the conclusion from Thomas)

The best bet for you is to remove those symlinks from your overlay, and
create them from a post-build script (where you can do the globbing you
need to find the current version string).

Or to create them as symlinks to libc.so.0 which we already create as a
sylink to the actual libuclibc-XXXX.so (but this is less flexible than a
post-build script).

Regards,
Yann E. MORIN.
diff mbox series

Patch

diff --git a/package/uclibc/uclibc.mk b/package/uclibc/uclibc.mk
index 3ba4589672..73664d5b0b 100644
--- a/package/uclibc/uclibc.mk
+++ b/package/uclibc/uclibc.mk
@@ -424,6 +424,10 @@  define UCLIBC_INSTALL_TARGET_CMDS
 		RUNTIME_PREFIX=/ \
 		install_runtime
 	$(UCLIBC_INSTALL_UTILS_TARGET)
+	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/libdl.so.0
+	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/libm.so.0
+	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/libpthread.so.0
+	ln -sf libuClibc-$(UCLIBC_VERSION).so $(TARGET_DIR)/lib/librt.so.0
 endef
 
 # STATIC has no ld* tools, only getconf