Message ID | 20190731160719.11396-44-alex.bennee@linaro.org |
---|---|
State | New |
Headers | show |
Series | plugins for TCG | expand |
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~
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 --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; +};