1*4882a593SmuzhiyunFrom de870d7f9f36b3e68f280057851a4585a67ab219 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Sergei Trofimovich <slyfox@gentoo.org> 3*4882a593SmuzhiyunDate: Tue, 14 Jan 2020 23:15:01 +0000 4*4882a593SmuzhiyunSubject: [PATCH] ei_portio.h: avoid ODR violation of 5*4882a593Smuzhiyun 'ei_default_socket_callbacks' 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunNoticed as a build failure against fresh gcc-master: 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun``` 10*4882a593SmuzhiyunLD otp/lib/erl_interface/bin/x86_64-unknown-linux-gnu/erl_call 11*4882a593Smuzhiyunld: 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 12*4882a593Smuzhiyunld: 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 13*4882a593Smuzhiyunld: 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 14*4882a593Smuzhiyunld: 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 15*4882a593Smuzhiyunld: 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 16*4882a593Smuzhiyuncollect2: error: ld returned 1 exit status 17*4882a593Smuzhiyunmake[3]: *** [x86_64-unknown-linux-gnu/Makefile:669: otp/lib/erl_interface/bin/x86_64-unknown-linux-gnu/erl_call] Error 1 18*4882a593Smuzhiyun``` 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunThe failure looks legitimate: `ei_default_socket_callbacks` is a 21*4882a593Smuzhiyunstruct defined in 'ei_portio.h' and in 'ei_portio.c'. 22*4882a593Smuzhiyun 23*4882a593SmuzhiyunThe change flips 'ei_portio.h' definition to declaration. 24*4882a593Smuzhiyun 25*4882a593Smuzhiyungcc-10 will change the default from -fcommon to fno-common: 26*4882a593Smuzhiyunhttps://gcc.gnu.org/PR85678. 27*4882a593Smuzhiyun 28*4882a593SmuzhiyunThe error also happens if CFLAGS=-fno-common passed explicitly. 29*4882a593Smuzhiyun 30*4882a593SmuzhiyunSigned-off-by: Sergei Trofimovich <slyfox@gentoo.org> 31*4882a593Smuzhiyun 32*4882a593SmuzhiyunPatch taken from upstream: https://github.com/erlang/otp/commit/de870d7f9f36b3e68f280057851a4585a67ab219 33*4882a593SmuzhiyunSigned-off-by: Heiko Thiery <heiko.thiery@gmail.com> 34*4882a593Smuzhiyun--- 35*4882a593Smuzhiyun lib/erl_interface/src/misc/ei_portio.h | 2 +- 36*4882a593Smuzhiyun 1 file changed, 1 insertion(+), 1 deletion(-) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyundiff --git a/lib/erl_interface/src/misc/ei_portio.h b/lib/erl_interface/src/misc/ei_portio.h 39*4882a593Smuzhiyunindex 84ebc5039a..5172d085b4 100644 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun--- a/lib/erl_interface/src/misc/ei_portio.h 42*4882a593Smuzhiyun+++ b/lib/erl_interface/src/misc/ei_portio.h 43*4882a593Smuzhiyun@@ -47,7 +47,7 @@ int ei_writev_fill_ctx_t__(ei_socket_callbacks *cbs, void *ctx, const struct iov 44*4882a593Smuzhiyun int ei_socket_callbacks_have_writev__(ei_socket_callbacks *cbs); 45*4882a593Smuzhiyun #endif 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun-ei_socket_callbacks ei_default_socket_callbacks; 48*4882a593Smuzhiyun+extern ei_socket_callbacks ei_default_socket_callbacks; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define EI_FD_AS_CTX__(FD) \ 51*4882a593Smuzhiyun ((void *) (long) (FD)) 52*4882a593Smuzhiyun-- 53*4882a593Smuzhiyun2.20.1 54*4882a593Smuzhiyun 55