[PATCH v2 6/6] qemucapsprobemock: Fix lookup of qemu functions

Roman Bolshakov posted 6 patches 5 years, 2 months ago
[PATCH v2 6/6] qemucapsprobemock: Fix lookup of qemu functions
Posted by Roman Bolshakov 5 years, 2 months ago
qemucapsprobemock can't find real versions of qemuMonitorSend() and
qemuMonitorJSONIOProcessLine() on macOS. That breaks qemucapsprobe.

The failure can be explained by documented behaviour of dlsym(3) on
macOS:

  If dlsym() is called with the special handle RTLD_NEXT, then dyld
  searches for the symbol in the dylibs the calling image linked against
  when built.

  [...] For flat linked images, the search starts in the load ordered
  list of all images, in the image right after the caller's image.

That means qemucapsprobemock must be linked against qemu test driver to
find symbols there with RTLD_NEXT.

Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
---
 tests/meson.build | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tests/meson.build b/tests/meson.build
index ef8ded1ea4..cc0657f3c1 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -101,7 +101,6 @@ endif
 if conf.has('WITH_QEMU')
   mock_libs += [
     { 'name': 'qemucaps2xmlmock' },
-    { 'name': 'qemucapsprobemock' },
     { 'name': 'qemucpumock' },
     { 'name': 'qemuhotplugmock' },
     { 'name': 'qemuxml2argvmock' },
@@ -171,6 +170,10 @@ if conf.has('WITH_QEMU')
     link_whole: [ qemu_driver_impl ],
     link_with: [ libvirt_lib ],
   )
+
+  mock_libs += [
+    { 'name': 'qemucapsprobemock', 'link_with': [ test_qemu_driver_lib ] },
+  ]
 else
   test_qemu_driver_lib = []
   test_utils_qemu_lib = []
-- 
2.29.2


Re: [PATCH v2 6/6] qemucapsprobemock: Fix lookup of qemu functions
Posted by Michal Prívozník 5 years, 2 months ago
On 11/23/20 11:10 PM, Roman Bolshakov wrote:
> qemucapsprobemock can't find real versions of qemuMonitorSend() and
> qemuMonitorJSONIOProcessLine() on macOS. That breaks qemucapsprobe.
> 
> The failure can be explained by documented behaviour of dlsym(3) on
> macOS:
> 
>    If dlsym() is called with the special handle RTLD_NEXT, then dyld
>    searches for the symbol in the dylibs the calling image linked against
>    when built.
> 
>    [...] For flat linked images, the search starts in the load ordered
>    list of all images, in the image right after the caller's image.
> 
> That means qemucapsprobemock must be linked against qemu test driver to
> find symbols there with RTLD_NEXT.
> 
> Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
> ---
>   tests/meson.build | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>

Michal