无法使用 LD_PRELOAD 挂钩 qemu 中的 mmap 系统调用(通过 libvirt)

Failed in using LD_PRELOAD to hook mmap system call in qemu(through libvirt)

我想在 qemu 中挂接 mmap 系统调用,我使用 libvirt 传递环境参数,如下所示:

<qemu:commandline>
  <qemu:env name='LD_PRELOAD' value='/glibcHookMMAP.so'/>
</qemu:commandline>

但是失败了!我很难找出是怎么回事!像这样登录libvirt:

ERROR: ld.so: object '/glibcHookMMAP.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.

首先,我觉得是权限的问题。但是文件 glibcHookMMAP.so 已经用命令 chmod 777.

完成了

环境:

Ubuntu 18.04.2 Linux 5.4.0-92

libvirt 4.0.0

qemu 2.11.1

OK,现在我知道解决方案了:Ubuntu 中的 Apparmor 策略限制了工作,就像 SELinux。因此我应该修改 /etc/apparmor.d/abstractions/libvirt-qemu 中的配置以允许 libvirt link .so.