[libvirt] Using magic ELF notes to export info about QEMU monitor commands
Daniel P. Berrange
berrange at redhat.com
Wed Aug 14 14:38:08 UTC 2013
On another mailing list some folks were discussing how to determine
what list of QEMU monitor commands a particular libvirt was written
to be able to use. Rich Jones mentioned a thing they are doing
in libguestfs using magic ELF notes:
> My only suggestion is that we could put the strings into a separate
> ELF section to make them easy to pull out of the binary.
>
> One of our libguestfs contributors did this for the libguestfs daemon
> so that it's possible now to examine the daemon and find out what
> binaries it runs/requires. He did it using the following macro:
>
> #define __external_command __attribute__((__section__(".guestfsd_ext_cmds")))
> #define GUESTFSD_EXT_CMD(___ext_cmd_var, ___ext_cmd_str) static const char ___ext_cmd_var[] __external_command = #___ext_cmd_str
>
> OpenSUSE's spec file has a section to read out the commands and
> produce dependencies. It uses objcopy to read out the commands from
> the binary:
>
> objcopy -j .guestfsd_ext_cmds -O binary $RPM_BUILD_ROOT/usr/sbin/guestfsd /dev/stdout | tr '\0' '\n' | sort -u
To which I replied
> Oooh, that's an interesting approach. It will tell you too much,
> in so much that it wouldn't be possible to see that a number of
> commands are supported by libvirt, but won't be used with specific
> QEMU version. But just having an automated way to extract this
> full list would still be pretty useful info. Since, we'd be able
> to automatically detect additions between releases.
>
> So I guess we could take our current code:
>
> virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("query-block",
> NULL);
>
> and change it to
>
> QEMU_JSON_CMD(QUERY_BLOCK, "query-block");
>
> ...
> virJSONValuePtr cmd = qemuMonitorJSONMakeCommand(QEMU_JSON_CMD_QUERY_BLOCK,
> NULL);
>
> with QEMU_JSON_CMD being a macro you use in global context to
> define a string constant + the elf section.
----- End forwarded message -----
In fact it would be preferable if you could just do it inline
> virJSONValuePtr cmd = qemuMonitorJSONMakeCommand(QEMU_JSON_CMD("query-block"),
> NULL);
>
instead of having the macro call separate, but it isn't clear that you
can define ELF sections from inline code like that.
Anyway, I'm not planning to implement this, but I wanted to mention
this idea in case if motivates anyone else here to have a go at writing
this feature idea....
Regards,
Daniel;
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list