My guess is that 2 libraries in your chain have the same symbol and a dlopen is called with something like LT_GROUP or LT_GLOBAL. When running with PERL_DL_NONLAZY the undefined symbol is resolved correctly but without it, the undefined symbol is resolved in another library and it probably takes different arguments. I've seen this before. It is hard to debug.
When I first hit this it was with unixODBC and some ODBC drivers when we put together Why do I get "SQLSetConnectOption err=-2" errors in my Perl scripts.