On Wed, Mar 29, 2017 at 5:20 PM, Jeff Law <l...@redhat.com> wrote:
> On 03/29/2017 02:56 PM, David Edelsohn wrote:
>>
>> On Wed, Mar 29, 2017 at 4:48 PM, Jeff Law <l...@redhat.com> wrote:
>>>
>>> On 03/29/2017 02:21 PM, David Edelsohn wrote:
>>>>
>>>>
>>>>
>>>> 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.
>>>
>>>
>>> Hmm, the act of statically linking against the shared libstdc++ certainly
>>> adds a wrinkle here.
>>>
>>> It's been a *long* time since I had to think about this stuff for a
>>> non-ELF
>>> system.  Please correct me if I goof anything up.
>>>
>>> Since we build a shared libstdc++, doesn't that set up a library ctor
>>> which
>>> should register the EH tables for the library as a whole?
>>>
>>> When we link against that library statically, we have to arrange to run
>>> the
>>> library's ctor from the main program's global ctors.  Right?  ie, it
>>> should
>>> be OK to have separate copies -- we just have to get them all registered
>>> properly?  Right?
>>
>>
>> GCC has to get them all of the EH frames registered into one table,
>> otherwise libgcc walks the frames to find a catcher for an exception
>> and doesn't find the address of the program counter in the sorted
>> table because that range was recorded in the other table.
>
> Right.  We have to register all the frame_infos into a single table.   I was
> mostly focused on the registration mechanism.  My recollection is that we'll
> create a library-wide ctor for libstdc++ which would register the
> frame_infos for the library and that ctor should be run by the main program.
> The main program will collect its own frame_infos and register them as well.

Yes, collect2 essentially creates a constructor that it schedules at a
high priority to record the frames that it found during the scan.

Thanks, David

Reply via email to