Hello, On Tue, May 26, 2015 at 07:35:22AM +0200, Guillem Jover wrote: > Hi! > > On Wed, 2015-05-20 at 09:49:22 +1200, Michael Hudson-Doyle wrote: > > On 20 May 2015 at 09:24, Guillem Jover <[email protected]> wrote: > > > On Fri, 2015-05-15 at 15:03:53 +1200, Michael Hudson-Doyle wrote: > > >> Package: libdpkg-perl > > >> Version: 1.17.25ubuntu1 > > >> Severity: normal > > > >> Upstream git now produces shared libraries and dpkg-shlibdeps > > >> complains noisily when processing them: > > >> > > >> dpkg-shlibdeps: warning: couldn't parse dynamic relocation record: > > >> 00000000002884d8 R_X86_64_64 > > >> type.func(*launchpad.net/go-xdg/v0.XDGDir) []string+0x0000000000000088 > > >> dpkg-shlibdeps: warning: couldn't parse dynamic relocation record: > > >> 00000000002884f0 R_X86_64_64 > > >> type.func(*launchpad.net/go-xdg/v0.XDGDir) []string+0x0000000000000090 > > >> dpkg-shlibdeps: warning: couldn't parse dynamic relocation record: > > >> 0000000000288858 R_X86_64_64 > > >> type.func(*launchpad.net/go-xdg/v0.XDGDir) []string > > >> dpkg-shlibdeps: warning: couldn't parse dynamic relocation record: > > >> 0000000000288940 R_X86_64_64 > > >> type.func(*launchpad.net/go-xdg/v0.XDGDir) []string > > >> > > >> I suppose a few regexp tweaks are required. > > > > > > This would imply changing the regexes to match on column basis or very > > > strict amount of spaces, because there are valid cases where a version > > > node or the visibility markers might or not be present, which seems a > > > bit more flaky, although I doubt the objdump output format has changed > > > for a long time, but we'd have to verify that. > > > > Yeah, the patch I wrote yesterday (at > > http://paste.ubuntu.com/11232233/) checks for the number of spaces > > indicated by an absent version. A bit fragile but I don't suppose > > this is very likely to change. Parsing the ELF would be better but > > obviously a bunch of work (Go has a nice ELF library :-), doesn't > > support versions though). > > As mentioned above, we'd need to check if this has changed in the > past, and if so how long ago. > > W/o having checked deeply, I think the patch can be simplified, by > just changing the regex to cover the different cases. But I'm still > uncertain if it is a good idea, given that it has the potential to > break existing stuff. > > It would be nice if the unit test would cover versions longer than > the normal space padding, and the visibility attributes. > > > > In any case, there's several things that come to mind why on first > > > thought this might seem like not an entirely good idea anyway (w/o > > > having never actually looked deep into Go in any serious way): > > > > > > - Is the ABI (for each supported arch) specified as part of the > > > language, or is it an implementation detail? > > > > Oh very much an implementation detail at this point. > > Ok. > > > > + If the latter, it means this might allow linking incompatible > > > objects, which is one of the reasons C++ does not specify the > > > mangling rules. > > > - Do the symbol names interop with GCC Go? > > > > I don't know for sure about the names, but there is no chance of the > > native toolchain and gccgo directly interoperating anyway: the native > > toolchain does not follow the platform ABI. > > But if the symbols match then users might end up linking both, which > might become run-time errors instead of link-time ones? This would not > seem ideal. Or is there something else to guarantee no mixups? > > > > - How would this handle ABI changes in the future if the symbols are > > > not mangled? > > > > At least in the medium term, there is not going to be anywhere near as > > much ABI stability over time with a Go library compared to a C or even > > C++ library. A new compiler version implies a new ABI version, for > > example. > > Hmm, so what would be the point of shared libraries then? If a new > compiler version implies a new ABI version, then that will require > rebuilding the world, with flag-day transitions, and automatic SOVERSION > bumps or Conflicts or similar. > > I'm also not seeing how it could provide a stable ABI w/o some kind of > mangling, or at lest some ABI namespaceing or tagging? > > > > - How would this handle interop with languages that do not support > > > spaces? Can you specify to export to a specific language so that > > > it gets symbols mangled for that? Or do you need something else > > > like manually specifying the symbols in asm, or something like > > > FFI? > > > > Go and other code can not interoperate directly (see above comments > > about not following ABI). There is a thing (cgo) that generates code > > to support thunking between the two worlds, and you can make it > > generate symbols that conform to C's expectations. > > > Besides that, the symbols that end up containing spaces are not the > > sort of things that other languages want to access, it's mostly stuff > > like the data for a type. > > Right, I realized that after sending my reply, when I actually peeked > at the spec for what were valid identifiers. :) > > > > On Mon, 2015-05-18 at 01:55:57 -0400, Guo Yixuan wrote: > > >> It seems that ELF symbol names can contain any characters, except "\0". > > >> So a correct solution would be read ELF from perl, instead of using the > > >> output of objdump. (Unless objdump has a -0 option similar to xargs...) > > > > > > While it's true that those are allowed symbols, as I could not find > > > anything stating otherwise in the ELF spec, I've to wonder about the > > > wisdom of that choice? But when handling dpkg issues, my most > > > conservative side comes afloat, so it might just be that talking here. :) > > > > > > And Implementing an ELF parser in perl, just to be able to support Go, > > > does not seem very compelling, no. > > I didn't find any perl module in CPAN exposing everything that we'd > need to be able to switch to. Do you know of any?
No, I don't know either. Those available on CPAN are roughly wrappers of readelf or something else, probably not better than our wrapper of objdump. I'm trying to write a XS module for libbfd, but that won't be anything close to stable and ready to use. > > > >> This discussion at golang provides some background: > > >> https://go-review.googlesource.com/19101 > > > > > > It complains about a session expired and that I need to login, after > > > ignoring the dialog, I cannot see anything there. Sorry for the glitch in the url. I've also seen this complaint after I opened it the second time... > > > > I think he means https://go-review.googlesource.com/#/c/10191/ > > Ah thanks. So, there seems to be some comments about mangling at least > spaces (or did I misinterpret that)? > > Andwhile I could agree that the dpkg perl modules are "buggy" because > they do not support spaces, as allowed by the ELF specs. It seems the > C++ approach was pretty wise when choosing to mangle the symbols and > sidestepped any such issue entirely. > > Thanks, > Guillem Regards, Yixuan -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected]

