rmaprath added a comment.

In http://reviews.llvm.org/D20677#442713, @EricWF wrote:

> In http://reviews.llvm.org/D20677#442687, @rmaprath wrote:
>
> > In http://reviews.llvm.org/D20677#442559, @EricWF wrote:
> >
> > > I have an issue with this change since it allows a libc++abi built 
> > > without exceptions to be used in a program compiled with them. I assert 
> > > that this should not be supported in any way.
> > >
> > > My personal preference would be to remove as much of the exception API 
> > > from the library when it's built without exceptions. This should cause 
> > > link errors if a program contains any code that throws. If this is not 
> > > done it creates bugs within code like `__terminate` as mentioned in an 
> > > inline comment.
> > >
> > > I would like to see another revision of this patch that removes as much 
> > > of the exception API as possible. Looking at the symbols defined in 
> > > `cxxabi.h` I would say ever symbol in sections 2.4 and 2.5 should not 
> > > longer be defined in the library.
> >
> >
> > That sounds generally OK to me. The toolchain I'm working on (ARM Compiler 
> > 6) has an elaborate mechanism (based on build attributes) to select the 
> > correct variant of libraries. In other words, if any of your objects are 
> > compiled with exceptions, you are guaranteed to no select any of the 
> > no-exceptions library variants. This avoids the problem you mentioned 
> > altogether.
>
>
> Note that that behavior will cause different issues in some cases. If you  
> link an executable  to two libraries, `libfoo.so` and `libbar.so`, where one 
> was compiled with exceptions and the other without you'll get two copies of 
> libc++abi in the program. Now you have two copies of the global terminate 
> handler and two copies of `__terminate` for the linker to select from.
>  If it selects the nothrow `__terminate` and the terminate handler throws an 
> exception your in trouble.


In this case, I expect the linker to only select one variant of libc++abi (the 
one with exceptions). The idea behind build-attributes is to capture user 
intentions, if the user links his program with `libbar.a` and `libfoo.a` user 
libraries (with and without exceptions), the linker would assume that the user 
meant to use exceptions rather than not, and hence select the with-exceptions 
libc++abi variant. The theory behind build-attributes is bit more complicated 
that that though, I'm not the best person to go on about this.

In any case, I agree that getting the linker to produce an error (when linking 
with-exceptions objects with a no-exceptions libc++abi) is much more clearer.

I have a small concern about how difficult this would make things for us though 
- our toolchain setup uses `-ffunction-sections` and `-fdata-sections` along 
with linker's unused-section elimination to get rid of most of the stuff not 
necessary for the final image, but I can't remember if unused-section 
elimination happens before or after checking for missing symbols. If it is the 
latter, then we might be in trouble with this approach. I will have a look into 
this when I get back to work.

Cheers,

/ Asiri


http://reviews.llvm.org/D20677



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to