Il 16/09/2013 12:24, Alex Bligh ha scritto:
At risk of heresy, can I suggest a rather simpler scheme that requires
a total of zero infrastructure changes?
Here's a patch against qemu 1.0 (sorry) Ubuntu dist (sorry) that
uses weak binding to load and compile against any version of
librbd:
https://github.com/flexiant/qemu/commit/6fa2e9c95bdaca7c814881e27f04424fb6cc2960
This requires librbd-dev headers of some sort in order to build. But
librbd does not need to be there on a deployment, and indeed multiple
versions work (and the patch does different things depending on
librbd version).
No, librbd does need to be there for the other symbols that are not weak
(e.g. rbd_aio_read). This approach cannot be "taken to the limit", i.e.
removing the librbd dependency altogether. For example:
xx.c:
int f(void)
{
return 42;
}
yy.c:
#pragma weak f
extern int f(void);
int main()
{
printf("%p %d", f, f ? f(): 67);
}
$ gcc xx.c -shared -o xx.so
$ LD_RUN_PATH=$PWD gcc yy.c xx.so -o yy
$ ./yy
0x4005b0 42
$ rm xx.so
$ ./yy
./yy: error while loading shared libraries: xx.so: cannot open shared
object file: No such file or directory
Also, the code _is_ ugly. Do it once and it's perhaps acceptable. Do
it for libiscsi, librbd, libcurl, libssh2, SPICE, GTK+, SDL etc. and it
becomes unmaintainable.
Paolo
This would seem to achieve the stated objective (qemu package can
be installed without librbd dependencies) without any reliance
on modules at all. So we could scrap the whole modules infrastructure
and just tell people developing third party libraries to use weak
binding. As you can see, for librbd anyway, the changes required
to support weak binding are pretty minimal.