diff mbox series

[v4,43/54] plugin: add API symbols to qemu-plugins.symbols

Message ID 20190731160719.11396-44-alex.bennee@linaro.org
State New
Headers show
Series plugins for TCG | expand

Commit Message

Alex Bennée July 31, 2019, 4:07 p.m. UTC
From: "Emilio G. Cota" <cota@braap.org>


Signed-off-by: Emilio G. Cota <cota@braap.org>

[AJB: moved into plugins]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>


---
v3
  - moved to plugins/
  - include qemu_plugin_reset
---
 Makefile                     |  1 +
 configure                    | 69 ++++++++++++++++++++++++++++++++++++
 plugins/.gitignore           |  2 ++
 plugins/Makefile.objs        | 14 ++++++++
 plugins/qemu-plugins.symbols | 38 ++++++++++++++++++++
 5 files changed, 124 insertions(+)
 create mode 100644 plugins/.gitignore
 create mode 100644 plugins/qemu-plugins.symbols

-- 
2.20.1

Comments

Richard Henderson Aug. 1, 2019, 7:42 p.m. UTC | #1
On 7/31/19 9:07 AM, Alex Bennée wrote:
> +#########################################

> +# See if --dynamic-list is supported by the linker

> +

> +cat > $TMPTXT <<EOF

> +{

> +  foo;

> +};

> +EOF

> +

> +cat > $TMPC <<EOF

> +#include <stdio.h>

> +void foo(void);

> +

> +void foo(void)

> +{

> +  printf("foo\n");

> +}

> +

> +int main(void)

> +{

> +  foo();

> +  return 0;

> +}

> +EOF

> +

> +ld_dynamic_list="no"

> +if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then

> +  ld_dynamic_list="yes"

> +fi

> +

> +#########################################

> +# See if -exported_symbols_list is supported by the linker

> +

> +cat > $TMPTXT <<EOF

> +  _foo

> +EOF

> +

> +ld_exported_symbols_list="no"

> +if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then

> +  ld_exported_symbols_list="yes"

> +fi

> +

> +if  test "$plugins" = "yes" &&

> +    test "$ld_dynamic_list" = "no" &&

> +    test "$ld_exported_symbols_list" = "no" ; then

> +  error_exit \

> +      "Plugin support requires specifying a set of symbols that " \

> +      "are exported to plugins. Unfortunately your linker doesn't " \

> +      "support the flag (--dynamic-list or -exported_symbols_list) used " \

> +      "for this purpose."

> +fi

> +

>  ########################################

>  # See if 16-byte vector operations are supported.

>  # Even without a vector unit the compiler may expand these.

> @@ -7318,6 +7371,22 @@ fi

>  if test "$plugins" = "yes" ; then

>      echo "CONFIG_PLUGIN=y" >> $config_host_mak

>      LIBS="-ldl $LIBS"

> +    # Copy the export object list to the build dir

> +    if test "$ld_dynamic_list" = "yes" ; then

> +	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak

> +	ld_symbols=qemu-plugins-ld.symbols

> +	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols

> +    elif test "$ld_exported_symbols_list" = "yes" ; then

> +	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak

> +	ld64_symbols=qemu-plugins-ld64.symbols

> +	echo "# Automatically generated by configure - do not modify" > $ld64_symbols

> +	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \

> +	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols

> +    else

> +	error_exit \

> +	    "If \$plugins=yes, either \$ld_dynamic_list or " \

> +	    "\$ld_exported_symbols_list should have been set to 'yes'."

> +    fi

>  fi

>  


How much of this should be skipped if --enable-static?
Or perhaps just dependent on --enable-plugins and let
that switch detect the conflict?


r~
Alex Bennée Oct. 11, 2019, 4:46 p.m. UTC | #2
Richard Henderson <richard.henderson@linaro.org> writes:

> On 7/31/19 9:07 AM, Alex Bennée wrote:

>> +#########################################

>> +# See if --dynamic-list is supported by the linker

>> +

>> +cat > $TMPTXT <<EOF

>> +{

>> +  foo;

>> +};

>> +EOF

>> +

>> +cat > $TMPC <<EOF

>> +#include <stdio.h>

>> +void foo(void);

>> +

>> +void foo(void)

>> +{

>> +  printf("foo\n");

>> +}

>> +

>> +int main(void)

>> +{

>> +  foo();

>> +  return 0;

>> +}

>> +EOF

>> +

>> +ld_dynamic_list="no"

>> +if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then

>> +  ld_dynamic_list="yes"

>> +fi

>> +

>> +#########################################

>> +# See if -exported_symbols_list is supported by the linker

>> +

>> +cat > $TMPTXT <<EOF

>> +  _foo

>> +EOF

>> +

>> +ld_exported_symbols_list="no"

>> +if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then

>> +  ld_exported_symbols_list="yes"

>> +fi

>> +

>> +if  test "$plugins" = "yes" &&

>> +    test "$ld_dynamic_list" = "no" &&

>> +    test "$ld_exported_symbols_list" = "no" ; then

>> +  error_exit \

>> +      "Plugin support requires specifying a set of symbols that " \

>> +      "are exported to plugins. Unfortunately your linker doesn't " \

>> +      "support the flag (--dynamic-list or -exported_symbols_list) used " \

>> +      "for this purpose."

>> +fi

>> +

>>  ########################################

>>  # See if 16-byte vector operations are supported.

>>  # Even without a vector unit the compiler may expand these.

>> @@ -7318,6 +7371,22 @@ fi

>>  if test "$plugins" = "yes" ; then

>>      echo "CONFIG_PLUGIN=y" >> $config_host_mak

>>      LIBS="-ldl $LIBS"

>> +    # Copy the export object list to the build dir

>> +    if test "$ld_dynamic_list" = "yes" ; then

>> +	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak

>> +	ld_symbols=qemu-plugins-ld.symbols

>> +	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols

>> +    elif test "$ld_exported_symbols_list" = "yes" ; then

>> +	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak

>> +	ld64_symbols=qemu-plugins-ld64.symbols

>> +	echo "# Automatically generated by configure - do not modify" > $ld64_symbols

>> +	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \

>> +	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols

>> +    else

>> +	error_exit \

>> +	    "If \$plugins=yes, either \$ld_dynamic_list or " \

>> +	    "\$ld_exported_symbols_list should have been set to 'yes'."

>> +    fi

>>  fi

>>

>

> How much of this should be skipped if --enable-static?

> Or perhaps just dependent on --enable-plugins and let

> that switch detect the conflict?


I've gated the ld_dynamic_list checks on if test "$static" = "no" so it
errors out quickly if you try and build with --static --enable-plugins.


>

>

> r~



--
Alex Bennée
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index ed4bb87f224..485e4bb2e85 100644
--- a/Makefile
+++ b/Makefile
@@ -726,6 +726,7 @@  distclean: clean
 	rm -f qemu-doc.fn qemu-doc.fns qemu-doc.info qemu-doc.ky qemu-doc.kys
 	rm -f qemu-doc.log qemu-doc.pdf qemu-doc.pg qemu-doc.toc qemu-doc.tp
 	rm -f qemu-doc.vr qemu-doc.txt
+	rm -f qemu-plugins-ld.symbols qemu-plugins-ld64.symbols
 	rm -f config.log
 	rm -f linux-headers/asm
 	rm -f docs/version.texi
diff --git a/configure b/configure
index dbc78f21b0c..7f6a1556fe2 100755
--- a/configure
+++ b/configure
@@ -30,6 +30,7 @@  TMPO="${TMPDIR1}/${TMPB}.o"
 TMPCXX="${TMPDIR1}/${TMPB}.cxx"
 TMPE="${TMPDIR1}/${TMPB}.exe"
 TMPMO="${TMPDIR1}/${TMPB}.mo"
+TMPTXT="${TMPDIR1}/${TMPB}.txt"
 
 rm -f config.log
 
@@ -5498,6 +5499,58 @@  if compile_prog "" "" ; then
   atomic64=yes
 fi
 
+#########################################
+# See if --dynamic-list is supported by the linker
+
+cat > $TMPTXT <<EOF
+{
+  foo;
+};
+EOF
+
+cat > $TMPC <<EOF
+#include <stdio.h>
+void foo(void);
+
+void foo(void)
+{
+  printf("foo\n");
+}
+
+int main(void)
+{
+  foo();
+  return 0;
+}
+EOF
+
+ld_dynamic_list="no"
+if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
+  ld_dynamic_list="yes"
+fi
+
+#########################################
+# See if -exported_symbols_list is supported by the linker
+
+cat > $TMPTXT <<EOF
+  _foo
+EOF
+
+ld_exported_symbols_list="no"
+if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
+  ld_exported_symbols_list="yes"
+fi
+
+if  test "$plugins" = "yes" &&
+    test "$ld_dynamic_list" = "no" &&
+    test "$ld_exported_symbols_list" = "no" ; then
+  error_exit \
+      "Plugin support requires specifying a set of symbols that " \
+      "are exported to plugins. Unfortunately your linker doesn't " \
+      "support the flag (--dynamic-list or -exported_symbols_list) used " \
+      "for this purpose."
+fi
+
 ########################################
 # See if 16-byte vector operations are supported.
 # Even without a vector unit the compiler may expand these.
@@ -7318,6 +7371,22 @@  fi
 if test "$plugins" = "yes" ; then
     echo "CONFIG_PLUGIN=y" >> $config_host_mak
     LIBS="-ldl $LIBS"
+    # Copy the export object list to the build dir
+    if test "$ld_dynamic_list" = "yes" ; then
+	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
+	ld_symbols=qemu-plugins-ld.symbols
+	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
+    elif test "$ld_exported_symbols_list" = "yes" ; then
+	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
+	ld64_symbols=qemu-plugins-ld64.symbols
+	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
+	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
+	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
+    else
+	error_exit \
+	    "If \$plugins=yes, either \$ld_dynamic_list or " \
+	    "\$ld_exported_symbols_list should have been set to 'yes'."
+    fi
 fi
 
 if test "$tcg_interpreter" = "yes"; then
diff --git a/plugins/.gitignore b/plugins/.gitignore
new file mode 100644
index 00000000000..7b8aaa1f109
--- /dev/null
+++ b/plugins/.gitignore
@@ -0,0 +1,2 @@ 
+qemu-plugins-ld.symbols
+qemu-plugins-ld64.symbols
diff --git a/plugins/Makefile.objs b/plugins/Makefile.objs
index 95baabf3d2f..6f14d91ccb9 100644
--- a/plugins/Makefile.objs
+++ b/plugins/Makefile.objs
@@ -5,3 +5,17 @@ 
 obj-y += loader.o
 obj-y += core.o
 obj-y += api.o
+
+# Abuse -libs suffix to only link with --dynamic-list/-exported_symbols_list
+# when the final binary includes the plugin object.
+#
+# Note that simply setting LDFLAGS is not enough: we build binaries that
+# never link plugin.o, and the linker might fail (at least ld64 does)
+# if the symbols in the list are not in the output binary.
+ifdef CONFIG_HAS_LD_DYNAMIC_LIST
+api.o-libs := -Wl,--dynamic-list=$(BUILD_DIR)/qemu-plugins-ld.symbols
+else
+ifdef CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST
+api.o-libs := -Wl,-exported_symbols_list,$(BUILD_DIR)/qemu-plugins-ld64.symbols
+endif
+endif
diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols
new file mode 100644
index 00000000000..40c0d1abd2f
--- /dev/null
+++ b/plugins/qemu-plugins.symbols
@@ -0,0 +1,38 @@ 
+{
+  qemu_plugin_uninstall;
+  qemu_plugin_reset;
+  qemu_plugin_register_vcpu_init_cb;
+  qemu_plugin_register_vcpu_exit_cb;
+  qemu_plugin_register_vcpu_idle_cb;
+  qemu_plugin_register_vcpu_resume_cb;
+  qemu_plugin_register_vcpu_insn_exec_cb;
+  qemu_plugin_register_vcpu_insn_exec_inline;
+  qemu_plugin_register_vcpu_mem_cb;
+  qemu_plugin_register_vcpu_mem_haddr_cb;
+  qemu_plugin_register_vcpu_mem_inline;
+  qemu_plugin_ram_addr_from_host;
+  qemu_plugin_register_vcpu_tb_trans_cb;
+  qemu_plugin_register_vcpu_tb_exec_cb;
+  qemu_plugin_register_vcpu_tb_exec_inline;
+  qemu_plugin_register_flush_cb;
+  qemu_plugin_register_vcpu_syscall_cb;
+  qemu_plugin_register_vcpu_syscall_ret_cb;
+  qemu_plugin_register_atexit_cb;
+  qemu_plugin_tb_n_insns;
+  qemu_plugin_tb_get_insn;
+  qemu_plugin_tb_vaddr;
+  qemu_plugin_insn_data;
+  qemu_plugin_insn_size;
+  qemu_plugin_insn_vaddr;
+  qemu_plugin_insn_haddr;
+  qemu_plugin_mem_size_shift;
+  qemu_plugin_mem_is_sign_extended;
+  qemu_plugin_mem_is_big_endian;
+  qemu_plugin_mem_is_store;
+  qemu_plugin_get_hwaddr;
+  qemu_plugin_hwaddr_is_io;
+  qemu_plugin_hwaddr_to_raddr;
+  qemu_plugin_vcpu_for_each;
+  qemu_plugin_n_vcpus;
+  qemu_plugin_n_max_vcpus;
+};