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:

Previous
From: Amit Langote
Date:
Subject: Re: [HACKERS] Add support for tuple routing to foreign partitions
Next
From: Thomas Munro
Date:
Subject: Isolation tester result formatting