On Jul 31, 2012, at 4:30 PM, David Edelsohn wrote: > On Sun, Jul 29, 2012 at 12:48 PM, Perry Smith <pedz...@gmail.com> wrote: >> Hi, >> >> This is an age old topic but I can't find how to solve it. I've searched >> the past few days. >> >> I'm trying to build passenger on AIX 6.1 TL07 SP03 using gcc 4.5.2 that I >> built myself. I've used it for a number of months and have built many >> things. >> >> The short question is how do I get rid of these warnings? >> >>> ld: 0711-768 WARNING: Object >>> ext/apache2/module_libboost_oxt.a[system_calls.o], section 1, function >>> .accept: >>> The branch at address 0x2ac0 is not followed by a recognized no-op >>> or TOC-reload instruction. The unrecognized instruction is >>> 0x7C601B78. >> >> The link has many errors like this. For whatever reason, passenger builds >> the same file two different ways and puts them in two different places. >> Upon closer examination the file that the link is complaining about does in >> fact have bad code. >> >> The bad compile line is: >> >>> g++ -Iext -fPIC -fvisibility=hidden -DVISIBILITY_ATTRIBUTE_SUPPORTED >>> -U__STR__ -D_THREAD_SAFE -D_LARGEFILE64_SOURCE >>> -I/gsa/ausgsa/projects/r/ruby/apache2/include/apr-1 >>> -I/gsa/ausgsa/projects/r/ruby/apache2/include/apr-1 >>> -I/gsa/ausgsa/projects/r/ruby/apache2/include -D_REENTRANT >>> -I/usr/local/include -DHASH_NAMESPACE="__gnu_cxx" >>> -DHASH_NAMESPACE="__gnu_cxx" -DHASH_FUN_H="<hash_fun.h>" >>> -DOXT_DISABLE_BACKTRACES -DHAS_ALLOCA_H -Wall -Wextra -Wno-unused-parameter >>> -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long >>> -Wno-missing-field-initializers -g -DPASSENGER_DEBUG >>> -DBOOST_DISABLE_ASSERTS -o >>> ext/apache2/module_libboost_oxt/oxt/system_calls.o -c >>> ext/oxt/system_calls.cpp >> >> and produces: >> >>> ... >>> lwz 5,128(31) >>> bl .accept >>> mr 0,3 >>> ... >> >> There needs to be a nop after the bl so the linker / loader can stuff in an >> instruction to restore the toc. >> >> There are many warnings for this compile as well about the visibility. e.g. >> >>> ext/oxt/system_calls.cpp: In function 'int oxt::syscalls::accept(int, >>> sockaddr*, socklen_t*)': >>> ext/oxt/system_calls.cpp:209:1: warning: visibility attribute not supported >>> in this configuration; ignored >> >> >> The compile line that is good is: >> >>> g++ -Iext -D_REENTRANT -I/usr/local/include -DHASH_NAMESPACE="__gnu_cxx" >>> -DHASH_NAMESPACE="__gnu_cxx" -DHASH_FUN_H="<hash_fun.h>" >>> -DOXT_DISABLE_BACKTRACES -DHAS_ALLOCA_H -Wall -Wextra -Wno-unused-parameter >>> -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long >>> -Wno-missing-field-initializers -g -DPASSENGER_DEBUG >>> -DBOOST_DISABLE_ASSERTS -o ext/common/libboost_oxt/oxt/system_calls.o -c >>> ext/oxt/system_calls.cpp >> >> which produces good code: >> >>> ... >>> lwz 5,128(31) >>> bl .accept >>> nop >>> mr 0,3 >>> ... >> >> The good compile has no warnings. >> >> I figure it is the -fvisibility that is getting me into trouble but I am not >> sure if it is safe to just get rid of it. There are also macros in the >> boost *.hpp files that muck with the visibility setting. >> >> The link line is (if needed): >> >>> g++ -shared ext/apache2/Configuration.o ext/apache2/Bucket.o >>> ext/apache2/Hooks.o ext/apache2/mod_passenger.o -fPIC -o >>> ext/apache2/mod_passenger.so -fPIC -fvisibility=hidden >>> -DVISIBILITY_ATTRIBUTE_SUPPORTED -U__STR__ -D_THREAD_SAFE >>> -D_LARGEFILE64_SOURCE -I/gsa/ausgsa/projects/r/ruby/apache2/include/apr-1 >>> -I/gsa/ausgsa/projects/r/ruby/apache2/include/apr-1 >>> -I/gsa/ausgsa/projects/r/ruby/apache2/include -D_REENTRANT >>> -I/usr/local/include -DHASH_NAMESPACE="__gnu_cxx" >>> -DHASH_NAMESPACE="__gnu_cxx" -DHASH_FUN_H="<hash_fun.h>" >>> -DOXT_DISABLE_BACKTRACES -DHAS_ALLOCA_H -Wall -Wextra -Wno-unused-parameter >>> -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-long-long >>> -Wno-missing-field-initializers -g -DPASSENGER_DEBUG >>> -DBOOST_DISABLE_ASSERTS ext/apache2/module_libpassenger_common.a >>> ext/apache2/module_libboost_oxt.a -fPIC >>> -L/gsa/ausgsa/projects/r/ruby/apache2/lib -lapr-1 -Wl,-G -Wl,-brtl >>> -L/gsa/ausgsa/projects/r/ruby/apache2/lib -laprutil-1 -lpthread > > The problem most likely is -fvisibility. AIX does not support > visibility the way that GNU/Linux does, although GNU/Linux is evolving > toward the symbol visibility model that AIX had all along. > > Two questions are: > > 1) Why does the package think that AIX supports visibility and using > those options?
I tracked this down. They ask "does the compiler support it?" (which gcc does) and so they assume the platform does. I changed the test to just return false on AIX. That got rid of the -fvisibility flag, 99% of my compile warnings as well as the link warnings. > > 2) Why is the package linking with -Wl,-G -Wl,-brtl? I've never 100% understood all this and so the package probably doesn't either. But -G implies -brtl so having both should be ok? Or did I misread the man page? > Basically, the package is trying to mix-and-match AIX linking behavior > and SVR4 behavior. It is trying to invoke the AIX linker with SVR4 > behavior, but then overriding the default SVR4 semantics and not using > matching flags for AIX. AIX defaults to not exporting most symbols, > but has options to export more symbols -- matching SVR4 behavior. > > The visibility options are trying to override the default SVR4 symbol > export behavior, which asserts to the compiler that the symbols will > be local and not need nops required by external calls. But then the > AIX linker is invoked with options to export more symbols and it is > finding external definitions of the symbols. > > I do not know what you mean by building two files in two different > ways and placing them in two different locations. Does the link line > link against both copies? No, it uses only one for the link I pasted. ext/apache2/module_libboost_oxt.a is a normal archive of ext/apache2/*.o I assume it uses the files in ext/common/libboost_oxt/oxt/*.o in a different link. > The Makefile also may be confused about > PIC, which is the default on AIX. The external symbol may be > overriding a local symbol because of AIX linker semantics. Yea. That seems to be benign so I haven't worried about it. > The basic problem is GNU/Linux symbol visibility behavior is becoming > more complicated (and actually evolving toward original AIX behavior), > but it also is using additional syntax and options in Makefiles > without invoking AIX with compatible, matching options. I'm hoping this is a good thing. GNU/Linux, to me, seemed rather sloopy and they could "link" and produce code that could eventually fail due to a missing symbol. The general open software developer perspective seemed to have a disdain for AIX's wanting to know where every symbol was going to come from at link time. > Removing -fvisibility probably will not cause any additional problems > because the AIX linker already is ignoring the options and intended > behavior, but many more symbols are leaking out than the package > intended. Thank you for your help. I am mostly completed the changes but are fighting a core dump when exit is called. Thank you again, Perry