Managing ABI compatibility (was Re: [PATCH 2/2] jit: add switch statements)
David Malcolm
dmalcolm@redhat.com
Fri Jun 26 19:15:00 GMT 2015
On Fri, 2015-06-26 at 13:57 -0400, David Malcolm wrote:
> On Thu, 2015-06-25 at 13:16 -0600, Jeff Law wrote:
> > On 06/25/2015 01:13 PM, David Malcolm wrote:
> > >
> > > * It extends the libgccjit API. It's not clear to me yet how to
> > > manage extensions of the libgccjit API: should I use symbol maps
> > > and versioning, or bump the SONAME? I'm thinking of providing
> > > precanned feature macros within libgccjit.h e.g:
> > >
> > > #define LIBGCCJIT_HAVE_SWITCH_STATEMENT
> > Seems to me you should use a symbol map and bump the version.
>
> Thanks. By "the version", do you mean the version within the symbol
> map?
>
> I've read Uli Drepper's "How To Write Shared Libraries" guide:
> http://www.akkadia.org/drepper/dsohowto.pdf
> and in particular section 3: "Maintaining APIs and ABIs", which suggests
> versioned DSOs (though this presumably implies the use of GNU ld).
>
> I attempted to use the symbol map to segregate the new symbols into
> their own version; attached is a patch which does that (on top of the
> "add switch statements" patch).
>
> Is that the kind of thing you had in mind?
>
> My first attempt was to keep the existing syms in an anonymous tag but I
> got:
> /usr/bin/ld: anonymous version tag cannot be combined with other
> version tags
> (which comes from binutils ld/ldlang.c:lang_register_vers_node)
>
> Hence I put the existing symbols into a LIBGCCJIT_ABI_1 version.
>
> With the above change, using "eu-readelf -s" I see a client program
> linked against libgccjit goes from having e.g.:
>
> GLOBAL DEFAULT UNDEF gcc_jit_context_compile
>
> to having:
>
> GLOBAL DEFAULT UNDEF gcc_jit_context_compile@@LIBGCCJIT_ABI_1
>
> and one using the new symbols has:
>
> GLOBAL DEFAULT UNDEF gcc_jit_context_compile@LIBGCCJIT_ABI_1 (2)
> GLOBAL DEFAULT UNDEF gcc_jit_block_end_with_switch@LIBGCCJIT_ABI_2 (4)
>
>
> Presumably I'd need to bump the SONAME to accommodate the introduction
> of using symbol versioning? Am I right in hoping that with the
> introduction to using symbol versioning that I'd never need to bump the
> SONAME again?
>
> Running:
>
> objdump -p client-binary-using-just-old-symbols
>
> gives (amongst other output):
>
> Version References:
> required from libc.so.6:
> 0x09691a75 0x00 03 GLIBC_2.2.5
> required from libgccjit.so.0:
> 0x00824161 0x00 02 LIBGCCJIT_ABI_1
>
> whereas:
>
> objdump -p client-binary-using-some-new-symbols
>
> gives:
>
> Version References:
> required from libc.so.6:
> 0x09691a75 0x00 03 GLIBC_2.2.5
> required from libgccjit.so.0:
> 0x00824162 0x00 04 LIBGCCJIT_ABI_2
> 0x00824161 0x00 02 LIBGCCJIT_ABI_1
>
> FWIW objdump -p is used by /usr/lib/rpm/find-requires, so presumably
> these entries would show up in rpm metadata, so that binaries using the
> new symbols get flagged at the RPM level as needing a more up-to-date
> libgccjit rpm.
>
> Hopefully other packaging systems handle symbol versioning in similar
> ways.
>
> Does this approach look sane?
>
> I'd probably add a page about ABI to the docs, and list the ABIs there.
>
> This doesn't cover the addition of new values to the various options
> enums; I'm not sure how to handle capturing *that* within the binary
> metadata without bumping the SONAME. Maybe bump the
> gcc_jit_context_set_FOO_option entrypoints into new version tags each
> time we add a new value to the corresponding option enum?
Maybe having public enums for the options was a mistake; perhaps
additional options should get their own API entrypoints:
e.g.
gcc_jit_context_set_bool_option_name_of_option
gcc_jit_context_set_int_option_name_of_option
gcc_jit_context_set_str_option_name_of_option
so perhaps:
extern void
gcc_jit_context_set_bool_option_allow_unreachable_blocks (gcc_jit_context *ctxt,
int value);
Quite a mouthful, but it means we can precisely identify client binaries
using it via metadata. (perhaps lose the "bool_", "option_" or
bool_option_" part?)
[...snip...]
More information about the Gcc-patches
mailing list