Re: RTLD_GLOBAL (& JIT inlining) - Mailing list pgsql-hackers
From | Andres Freund |
---|---|
Subject | Re: RTLD_GLOBAL (& JIT inlining) |
Date | |
Msg-id | 20180223080511.m6v6qukskpdwe3dq@alap3.anarazel.de Whole thread Raw |
In response to | RTLD_GLOBAL (& JIT inlining) (Andres Freund <andres@anarazel.de>) |
List | pgsql-hackers |
Hi, On 2018-02-22 23:11:07 -0800, Andres Freund wrote: > I think using RTLD_LOCAL on most machines would be a much better > idea. I've not found proper explanations why GLOBAL is used. We started > using it ages ago, with [2], but that commit contains no explanation, > and a quick search didn't show up anything either. Peter? Hm. No idea if that was the reason back then, but I think it's unfortunately not easy to change. The reason why some plperlu tests fail, is that plperl extension libraries rely on plperl to be loaded into the global namespace. When plperl gets loaded with RTLD_LOCAL all the dependant shared libaries (i.e. libperl.so) also get loaded with it. That works perfectly for plperl itself, but once per loads an extension library is loaded, it fails to resolve libperl.so symbols... I can "fix" this by dlopen(RTLD_GLOBAL) libperl.so, but that's obviously not a practial solution. FWIW, something in plperl's error handling appears to be busted. Instead of a helpful error report we get: ERROR: 22021: invalid byte sequence for encoding "UTF8": 0x00 which doesn't help much to nail down the issue. With a breakpoint it becomes clear what the issue is: #0 report_invalid_encoding (encoding=6, mbstr=0x557ae880416b "", len=252) at /home/andres/src/postgresql/src/backend/utils/mb/wchar.c:1997 #1 0x0000557ae73d4473 in pg_verify_mbstr_len (encoding=6, mbstr=0x557ae880416b "", len=252, noError=0 '\000') at /home/andres/src/postgresql/src/backend/utils/mb/wchar.c:1936 #2 0x0000557ae73d4354 in pg_verify_mbstr (encoding=6, mbstr=0x557ae8804080 "Can't load '/usr/lib/x86_64-linux-gnu/perl5/5.26/auto/List/Util/Util.so' for module List::Util:/usr/lib/x86_64-linux-gnu/perl5/5.26/auto/List/Util/Util.so: undefined symbol: PL_memory_wrap at /usr/share/perl/5.26/XSLoader.pmline 96.\n", len=487, noError=0 '\000') at /home/andres/src/postgresql/src/backend/utils/mb/wchar.c:1879 #3 0x0000557ae73d119a in pg_any_to_server ( s=0x557ae8804080 "Can't load '/usr/lib/x86_64-linux-gnu/perl5/5.26/auto/List/Util/Util.so' for module List::Util: /usr/lib/x86_64-linux-gnu/perl5/5.26/auto/List/Util/Util.so:undefined symbol: PL_memory_wrap at /usr/share/perl/5.26/XSLoader.pmline 96.\n", len=487, encoding=6) at /home/andres/src/postgresql/src/backend/utils/mb/mbutils.c:572 #4 0x00007f4cabb6b123 in utf_u2e ( utf8_str=0x557ae8804080 "Can't load '/usr/lib/x86_64-linux-gnu/perl5/5.26/auto/List/Util/Util.so' for module List::Util:/usr/lib/x86_64-linux-gnu/perl5/5.26/auto/List/Util/Util.so: undefined symbol: PL_memory_wrap at /usr/share/perl/5.26/XSLoader.pmline 96.\n", len=487) at /home/andres/src/postgresql/src/pl/plperl/plperl_helpers.h:16 #5 0x00007f4cabb6b2f6 in sv2cstr (sv=0x557ae8769568) at /home/andres/src/postgresql/src/pl/plperl/plperl_helpers.h:96 #6 0x00007f4cabb732dc in plperl_call_perl_func (desc=0x557ae86cf6b0, fcinfo=0x557ae875fc20) at /home/andres/src/postgresql/src/pl/plperl/plperl.c:2250 #7 0x00007f4cabb74a3b in plperl_func_handler (fcinfo=0x557ae875fc20) at /home/andres/src/postgresql/src/pl/plperl/plperl.c:2438 I don't now perl apis at all, but it's clearly wrong that fram 3,4 show len=487, which comes from SvPVutf8() in sv2cstr(). It appears that somehow perl throws out two error messages separated by a null byte... (gdb) p *(char[487]*)utf8_str $42 = "Can't load '/usr/lib/x86_64-linux-gnu/perl5/5.26/auto/List/Util/Util.so' for module List::Util: /usr/lib/x86_64-linux-gnu/perl5/5.26/auto/List/Util/Util.so:undefined symbol: PL_memory_wrap at /usr/share/perl/5.26/XSLoader.pmline 96.\n\000 at /usr/lib/x86_64-linux-gnu/perl5/5.26/List/Util.pm line 23.\nCompilationfailed in require at /usr/lib/x86_64-linux-gnu/perl5/5.26/Scalar/Util.pm line 23.\nCompilation failed inrequire at /usr/lib/x86_64-linux-gnu/perl/5.26/Data/Dumper.pm line 303.\n" Greetings, Andres Freund
pgsql-hackers by date: