Wireshark-dev: Re: [Wireshark-dev] resolving external symbol for ASN.1 plugin issue

From: R Massink <robin.dev@xxxxxxxxx>
Date: Wed, 21 Feb 2024 20:54:00 +0100
Dear John,

Thanks a lot for your reply, that was exactly the issue and really helped me get unstuck. I've got it working now by using the WS_DLL_PUBLIC. Will think of how to best move forward.

Cheers!

Robin

On Wed, Feb 21, 2024 at 12:57 AM John Thacker <johnthacker@xxxxxxxxx> wrote:
On Tue, Feb 20, 2024 at 6:09 PM R Massink <robin.dev@xxxxxxxxx> wrote:
Hello,

I've been active in creating a dissector for IEC61850, which is mapped on top of mms. There is an integrated mms dissector that I'm using as a template, while mapping all mms names to the IEC61850 equivalent. I have been able to successfully use asn2wrs.py to generate a packet dissector from the .cnf and .asn files, and can build a static wireshark executable with my dissector included.

However, I'm now trying to get the same dissector to work as an external plugin, so it can be loaded by others into their wireshark without having to use my compiled version of wireshark.

While the external plugin compiled fine, i'm running into the problem that the dissector_acse_* external symbols cannot be resolved(dissect_acse_EXTERNALt is the first one) during runtime. The dissector relies on these symbols from epan/dissectors/packet-acse.c, and as statically build dissector they can of course be resolved. But when the plugin loads externally during runtime(manual or automatic), the symbol cannot be resolved anymore, while I can find it in libwireshark.so, which is in turn loaded into memory by the wireshark process.

I was not able to find other wireshark examples where external plugins relied on symbols from statically linked dissectors. Is what I want simply not possible, and should I include all acse dissector, and sub dependencies as well in my plugin(lots of code duplication), or am I building the plugin not correct or missing a linker flag?

The issue is not exactly in your plugin, but in the other dissector.

Example where external plugins use symbols from dissectors in the main tree:

opcua/opcua.c uses tcp_dissect_pdus from epan/dissectors/packet-tcp.h

By default symbols are not visible. To make a symbol visible, it must have WS_DLL_PUBLIC, which is defined in include/ws_symbol_export.h


WS_DLL_PUBLIC void
tcp_dissect_pdus(...);

For a ASN.1 generated dissector, to cause an existing symbol to be exported, look at this commit:


Where I altered the .cnf file for the x509af dissector so that dissect_x509af_Certificate got the WS_DLL_PUBLIC
attribute added to it by the asn2wrs.py process.

Cheers,
John Thacker


___________________________________________________________________________
Sent via:    Wireshark-dev mailing list <wireshark-dev@xxxxxxxxxxxxx>
Archives:    https://www.wireshark.org/lists/wireshark-dev
Unsubscribe: https://www.wireshark.org/mailman/options/wireshark-dev
             mailto:wireshark-dev-request@xxxxxxxxxxxxx?subject=unsubscribe