php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #50140 [PATCH] With default compilation option, php symbols are unresolved for nsapi
Submitted: 2009-11-10 18:46 UTC Modified: 2009-11-17 21:18 UTC
From: basant dot kukreja at gmail dot com Assigned: thetaphi
Status: Closed Package: iPlanet related
PHP Version: 5.3SVN-2009-11-10 (SVN) OS: Linux
Private report: No CVE-ID:
 [2009-11-10 18:46 UTC] basant dot kukreja at gmail dot com
Description:
------------
On Fedora 11, by default gcc uses 
"-fvisibility=hidden", When we compile it for Sun Web Server using following
configure options, php compiles fine.
'./configure' '--with-nsapi=<server_path>' '--with-zlib' '--prefix=/usr/local'

But when we start the web server, we get the following error : 

failure: CORE2253: Error running Init function load-modules: dlsym for php5_init failed (<path>/lib/libphp5.so: undefined symbol: php5_init)
failure: server initialization failed



Expected result:
----------------
Server should be able to load php correctly.

Actual result:
--------------
Sun Web Server fails to start because of unexported symbols.

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-11-10 18:48 UTC] basantk@php.net
Here is how symbols looks like :


$ nm .libs/libphp5.so | grep php5
004dcfb7 t php5_auth_trans
004dc661 t php5_close
004dc802 t php5_execute
004dc6d4 t php5_init

Symbols are not exported by default.

If we remove 
-fvisibility=hidden from compilation options then php compiles
fine and server is able to load libphp5.so correctly.

 [2009-11-10 18:59 UTC] basantk@php.net
Here is the snipp from gcc man page :
<man gcc>
"
 -fvisibility=default|internal|hidden|protected
...
          For those adding visibility support to existing code, you may find #pragma GCC visibility of
           use.  This works by you enclosing the declarations you wish to set visibility for with (for
           example) #pragma GCC visibility push(hidden) and #pragma GCC visibility pop. 
...
"


Pusing default visibility before including nsapi.h (and popping after) would
help in compiling and loading php correctly with nsapi servers.

Here is the patch against recent php 5.3 svn
--------------------------------------------
Index: sapi/nsapi/nsapi.c
===================================================================
--- sapi/nsapi/nsapi.c  (revision 290447)
+++ sapi/nsapi/nsapi.c  (working copy)
@@ -66,7 +66,9 @@
 /*
  * NSAPI includes
  */
+#pragma GCC visibility push(default)
 #include "nsapi.h"
+#pragma GCC visibility pop
 
 #define NSLS_D         struct nsapi_request_context *request_context
 #define NSLS_DC                , NSLS_D
--------------------------------------------


 [2009-11-10 19:14 UTC] basantk@php.net
The previous patch didn't resolve the problem, here is what helped 
resolved the issue. NSAPI_PUBLIC should have made the symbols public
but it seems it doesn't.

Index: sapi/nsapi/nsapi.c
===================================================================
--- sapi/nsapi/nsapi.c  (revision 290447)
+++ sapi/nsapi/nsapi.c  (working copy)
@@ -67,6 +67,7 @@
  * NSAPI includes
  */
 #include "nsapi.h"
+#pragma GCC visibility push(default)
 
 #define NSLS_D         struct nsapi_request_context *request_context
 #define NSLS_DC                , NSLS_D
 [2009-11-10 19:20 UTC] basantk@php.net
From nsapi.h : 

#ifdef XP_UNIX
#define NSAPI_PUBLIC
...

It seems NSAPI_PUBLIC is expanded to empty string.

--------------------------------------------

When I expanded after preprocessing nsapi.c, here is what I got :

# 915 ".../php-src-5.3/sapi/nsapi/nsapi.c"
int php5_init(pblock *pb, Session *sn, Request *rq)

--------------------------------------
So we need to tell gcc to export the NSAPI_PUBLIC symbols.
 [2009-11-11 12:35 UTC] jani@php.net
Check how this is fixed for Apache: sapi/apache2handler/php_apache.h and search for "visibility". I think you should do that instead of using any #pragma's.
 [2009-11-11 17:39 UTC] basantk@php.net
Thanks Jani for your suggestion. Based on your suggestion, I have
revised the patch. Here is the new patch :
---------------------------------------------
Index: sapi/nsapi/nsapi.c
===================================================================
--- sapi/nsapi/nsapi.c	(revision 290447)
+++ sapi/nsapi/nsapi.c	(working copy)
@@ -67,6 +67,11 @@
  * NSAPI includes
  */
 #include "nsapi.h"
+/* fix for gcc4 visibility issue */
+#ifndef PHP_WIN32
+# undef NSAPI_PUBLIC
+# define NSAPI_PUBLIC PHPAPI
+#endif
 
 #define NSLS_D		struct nsapi_request_context *request_context
 #define NSLS_DC		, NSLS_D
-------------------------------------------

With this patch, when I preprocess the file, on linux I get following
for php5_init :

int __attribute__ ((visibility("default"))) php5_init(pblock *pb, Session *sn, Request *rq)
-------------------------------------------

The above correctly export the symbols.

 [2009-11-17 19:58 UTC] basantk@php.net
Here is the link to the patch (submitted in previous comments) :
http://bitbucket.org/basantk/phpbugs/raw/d3b5e6d6e344/php_gcc_nsapi_fix.txt

 [2009-11-17 20:47 UTC] thetaphi@php.net
I'll take care. Thanks for the patch!

Will commit this to 5.3 and trunk.
 [2009-11-17 21:17 UTC] svn@php.net
Automatic comment from SVN on behalf of thetaphi
Revision: http://svn.php.net/viewvc/?view=revision&revision=290887
Log: Fix bug #50140: With default compilation option, php symbols are unresolved for nsapi
 [2009-11-17 21:18 UTC] thetaphi@php.net
This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.

I'll committed to trunk and PHP_5_3 branch.
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Sun Apr 20 10:02:06 2014 UTC