On Wed, Mar 29, 2017 at 3:50 PM, Jeff Law <l...@redhat.com> wrote:
> On 03/27/2017 09:41 AM, David Edelsohn wrote:
>>>
>>> As far as I have discovered, the real problem with AIX exception handling
>>> is
>>> that the exception landing pads are symbols that must not (but still are)
>>> exported from shared libraries - even libstdc++.
>>>
>>> I'm wondering if attached libtool(!)-patch would fix even that GDB
>>> problem
>>> once applied to each(!) shared library creation procedure.
>>>
>>> However, each workaround still applies as long as there's a single shared
>>> library involved that has not stopped exporting these symbols yet.
>>>
>>> Thoughts?
>>>
>>> Maybe gcc's collect2 should apply this additional symbol filter itself
>>> calling (AIX) ld, rather than leaving this to each build system?
>>>
>>> * m4/libtool.m4 (_LT_LINKER_SHLIBS): On AIX, GNU g++ generates
>>> _GLOBAL__ symbols as, amongst others, landing pads for C++ exceptions.
>>> These symbols must not be exported from shared libraries, or exception
>>> handling may break for applications with runtime linking enabled.
>>
>>
>> Hi, Michael
>>
>> Thanks for the analysis.
>>
>> The problem with EH for GDB involves static linking, not runtime
>> linking.
>
> That seems to be my understanding as well.
>
>> And there seems to be different behavior for GCC 4.8 and GCC
>> 4.9.
>
> Could it perhaps be an IPA issue -- we know IPA can change symbol
> scope/linkage  in some cases.  Maybe it's mucking things up.  Is there more
> detail in a thread elsewhere on this issue?

The problem is GCC EH tables and static linking.  libstdc++ and the
main application are ending up with two separate copies of the tables
to register EH frames.

Static linking worked in GCC 4.8, but not in GCC 4.9.  I have been
trying to understand what changed and if GCC 4.8 worked by accident.

Note that AIX does not install a separate libstdc++ static archive and
instead statically links against the shared object.  libstdc++
apparently uses the EH table referenced when it was bound by collect2
and the application uses the one created when the executable is
created -- the libgcc_eh.a solution doesn't work.  Again, the question
is why this apparently functioned correctly for GCC.4.8.

There was a change to constructor order around that time and that may
have affected where EH frames were recorded.

Thanks, David

Reply via email to