0003-ei_portio.h-avoid-ODR-violation-of-ei_default_socket.patch 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. From de870d7f9f36b3e68f280057851a4585a67ab219 Mon Sep 17 00:00:00 2001
  2. From: Sergei Trofimovich <slyfox@gentoo.org>
  3. Date: Tue, 14 Jan 2020 23:15:01 +0000
  4. Subject: [PATCH] ei_portio.h: avoid ODR violation of
  5. 'ei_default_socket_callbacks'
  6. Noticed as a build failure against fresh gcc-master:
  7. ```
  8. LD otp/lib/erl_interface/bin/x86_64-unknown-linux-gnu/erl_call
  9. ld: otp/lib/erl_interface/obj/x86_64-unknown-linux-gnu/libei.a(eirecv.o):otp/lib/erl_interface/src/misc/ei_portio.h:50: multiple definition of `ei_default_socket_callbacks'; otp/lib/erl_interface/obj/x86_64-unknown-linux-gnu/libei.a(ei_connect.o):otp/lib/erl_interface/src/misc/ei_portio.h:50: first defined here
  10. ld: otp/lib/erl_interface/obj/x86_64-unknown-linux-gnu/libei.a(send.o):otp/lib/erl_interface/src/misc/ei_portio.h:50: multiple definition of `ei_default_socket_callbacks'; otp/lib/erl_interface/obj/x86_64-unknown-linux-gnu/libei.a(ei_connect.o):otp/lib/erl_interface/src/misc/ei_portio.h:50: first defined here
  11. ld: otp/lib/erl_interface/obj/x86_64-unknown-linux-gnu/libei.a(send_reg.o):otp/lib/erl_interface/src/misc/ei_portio.h:50: multiple definition of `ei_default_socket_callbacks'; otp/lib/erl_interface/obj/x86_64-unknown-linux-gnu/libei.a(ei_connect.o):otp/lib/erl_interface/src/misc/ei_portio.h:50: first defined here
  12. ld: otp/lib/erl_interface/obj/x86_64-unknown-linux-gnu/libei.a(epmd_port.o):otp/lib/erl_interface/src/misc/ei_portio.h:50: multiple definition of `ei_default_socket_callbacks'; otp/lib/erl_interface/obj/x86_64-unknown-linux-gnu/libei.a(ei_connect.o):otp/lib/erl_interface/src/misc/ei_portio.h:50: first defined here
  13. ld: otp/lib/erl_interface/obj/x86_64-unknown-linux-gnu/libei.a(ei_portio.o):otp/lib/erl_interface/src/misc/ei_portio.h:50: multiple definition of `ei_default_socket_callbacks'; otp/lib/erl_interface/obj/x86_64-unknown-linux-gnu/libei.a(ei_connect.o):otp/lib/erl_interface/src/misc/ei_portio.h:50: first defined here
  14. collect2: error: ld returned 1 exit status
  15. make[3]: *** [x86_64-unknown-linux-gnu/Makefile:669: otp/lib/erl_interface/bin/x86_64-unknown-linux-gnu/erl_call] Error 1
  16. ```
  17. The failure looks legitimate: `ei_default_socket_callbacks` is a
  18. struct defined in 'ei_portio.h' and in 'ei_portio.c'.
  19. The change flips 'ei_portio.h' definition to declaration.
  20. gcc-10 will change the default from -fcommon to fno-common:
  21. https://gcc.gnu.org/PR85678.
  22. The error also happens if CFLAGS=-fno-common passed explicitly.
  23. Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
  24. Patch taken from upstream: https://github.com/erlang/otp/commit/de870d7f9f36b3e68f280057851a4585a67ab219
  25. Signed-off-by: Heiko Thiery <heiko.thiery@gmail.com>
  26. ---
  27. lib/erl_interface/src/misc/ei_portio.h | 2 +-
  28. 1 file changed, 1 insertion(+), 1 deletion(-)
  29. diff --git a/lib/erl_interface/src/misc/ei_portio.h b/lib/erl_interface/src/misc/ei_portio.h
  30. index 84ebc5039a..5172d085b4 100644
  31. --- a/lib/erl_interface/src/misc/ei_portio.h
  32. +++ b/lib/erl_interface/src/misc/ei_portio.h
  33. @@ -47,7 +47,7 @@ int ei_writev_fill_ctx_t__(ei_socket_callbacks *cbs, void *ctx, const struct iov
  34. int ei_socket_callbacks_have_writev__(ei_socket_callbacks *cbs);
  35. #endif
  36. -ei_socket_callbacks ei_default_socket_callbacks;
  37. +extern ei_socket_callbacks ei_default_socket_callbacks;
  38. #define EI_FD_AS_CTX__(FD) \
  39. ((void *) (long) (FD))
  40. --
  41. 2.20.1