Since libnss_wins.so is meant to be dynamically loaded into many other programs, it should avoid using function names that may collide with names that other programs might want to use. For example, having wins as a hostname resolution method in my /etc/nsswitch.conf caused my elinks web browser to crash. (See the attached URL for details.) In short, elinks contains a function called convert_string(), which causes libnss_wins.so to segfault because libnss_wins.so calls elinks's convert_string() instead of its own. There are many many potential land-mine symbols like that in libnss_wins.so, such as add_suffix, align_string, allow_access, become_daemon, close_sock, file_save, etc. Any of them could cause unpredictable breakage in any program that performs hostname lookups! Contrast this with most of my other libnss_* libraries on my system, which don't define many symbols, and those that are defined have nice long names that are unlikely to clash with anything. It might be a rather large undertaking to properly clean up the namespace of libnss_wins.so, but it is possible to easily mitigate its effects by linking the shared library with a -Bsymbolic flag. Using -Bsymbolic changes the runtime symbol lookup order to first look in libnss_wins.so itself before looking elsewhere. I believe that that is the desired behavior, and should be used on all platforms that support it. By linking libnss_wins.so with -Bsymbolic, I was able to run elinks without errors despite the clash of the convert_string() function name.
Created attachment 517 [details] Link shared libraries using -Bsymbolic This mitigates namespace clash problems for me (on Fedora Core 2). I'll leave it to those who have more experience than I to propagate the fix to other platforms with the appropriate automake magic.
Could I get a comment on the -Bsymbolic change please? Any reason why it shouldn't be added (at least for Linux)?
Great idea - I've checked it in for linux.
My suggested patch was applied incorrectly to the source. You need to pass -Wl,-Bsymbolic to gcc so that it will invoke ld with the -Bsymbolic flag. The source code is missing the -Wl, part. To gcc, the naked -B option specifies the path where gcc should look for its supporting files. Therefore the botched patch has no effect, so I'm re-opening this bug.
Doh - my fault. I should have actually applied the patch and not done it by hand. Sorry. Hopefully it should be OK now.
sorry for the same, cleaning up the database to prevent unecessary reopens of bugs.