On Wed, Sep 13, 2017 at 12:57:45PM +0300, Lluís Vilanova wrote: > + /* mandatory initialization function */ > + int main(int argc, const char **argv)
Most shared library plugin interfaces I have seen do not use "main()" as the entry point. Instead they use a unique name that allows the host application to differentiate between share library files that are valid plugins (e.g. "qemu_instr_init") and non-plugin shared libraries. Stable plugin APIs usually have a versioning or feature detection scheme. Versioning is simple: the host application passes a major/minor version number to the init function. Of course the dynamic linker already enforces compatibility somewhat: if a plugin uses a newer API than available in the host application then there will be a missing symbol/linker error. So what versioning strategy should we follow? The simplest would be to depend 100% on the dynamic linker with no explicit checks inside the plugin or QEMU. In that case the API/ABI need to follow some rules like this (not sure how oudated this information is): http://plan99.net/~mike/writing-shared-libraries.html > + { > + int i; > + printf("init!\n"); > + printf(" argc :: %d\n", argc); > + for (i = 0; i < argc; i++) { > + printf(" -> %s\n", argv[i]); > + } > + > + qi_set_fini(fini, NULL); > + > + /* instrument and trace events */ > + QITraceEvent *ev; > + > + qi_event_set_guest_cpu_enter(guest_cpu_enter); > + ev = qi_trace_event_name("guest_cpu_enter"); > + assert(ev); > + qi_trace_event_set_state_dynamic(ev, true); > + > + qi_event_set_guest_mem_before_trans(guest_mem_before_trans); > + ev = qi_trace_event_name("guest_mem_before_trans"); > + assert(ev); > + qi_trace_event_set_state_dynamic(ev, true); > + > + qi_event_set_guest_mem_before_exec(guest_mem_before_exec); > + ev = qi_trace_event_name("guest_mem_before_exec"); > + assert(ev); > + qi_trace_event_set_state_dynamic(ev, true); Why are trace events being enabled in this example? I would expect qi_event_set_guest_cpu_enter(guest_cpu_enter) to immediately enable the callback. The user shouldn't need to use tracing to receive callbacks. qi_event_set_guest_cpu_enter(NULL) should disable the callback. Stefan