<div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">The alignment/padding in a C struct depends on the hardware, the ABI, the compiler, and the options that were given to the compiler at build time.  In the past I ran into serious problems trying to exchange binary data between C programs running on the same machine that were compiled by different compilers.  (I have three C compilers on my el-cheapo Linux box, and could easily add a fourth if I wanted, all free.  The last time I tried the fifth free compiler, it did not work, but I live in hope.)</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Me, I'd use an existing C compiler to do the parsing, such as GCC-XML or CastXML, extract the struct declaration from that, and generate both C and Erlang code for pickling and unpickling.  (Or if you are fluent in SML, you could give the ckit library a go.  There are also C lexers/parsers/verifiers in OCaml.)</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">More likely, I'd just invent a little tabular DSL for describing the structs I wanted to communicate between C and Erlang, and generate the C declaration and other code and the Erlang code from that, to save having to learn yet another tool.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, 7 Dec 2018 at 17:21, Frank Muller <<a href="mailto:frank.muller.erl@gmail.com">frank.muller.erl@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">Hi guys</span><br style="color:rgb(49,49,49);word-spacing:1px"><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">Let assume the following C structure (I have a bunch of them, all different):</span><br style="color:rgb(49,49,49);word-spacing:1px"><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">struct foo {</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)"> int32 i32;</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)"> char c;</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)"> int64 i64;</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)"> char * p;</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)"> float f;</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)"> char * str[16]; </span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">}; </span><br style="color:rgb(49,49,49);word-spacing:1px"><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)"><div dir="auto">When it gets compiled, GCC will add some padding to align data types (i.e self-alignment). More info at:</div></span><br style="color:rgb(49,49,49);word-spacing:1px"><a href="http://www.catb.org/esr/structure-packing/" rel="noreferrer" style="font-size:1rem;word-spacing:1px" target="_blank">http://www.catb.org/esr/structure-packing/</a><br style="color:rgb(49,49,49);word-spacing:1px"><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">On the Erlang side, it is very easy to generate a binary which matches this C structure field by field.</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">But it won’t work because of the padding :-/</span><br style="color:rgb(49,49,49);word-spacing:1px"><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">Question: how can I derive the GCC's padding, and automatically add it to my Erlang binary?</span><div dir="auto"><span style="background-color:rgb(255,255,255)"><br style="color:rgb(49,49,49);word-spacing:1px"></span><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">I am open to any generic/flexible solutions even if I have to auto-generate these C structures (i.e meta-programming).</span><br style="color:rgb(49,49,49);word-spacing:1px"><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">Thank you.</span><br style="color:rgb(49,49,49);word-spacing:1px"><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">/Frank</span></div>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div>