Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to get a pointer to a binary section in MSVC?
    primarykey
    data
    text
    <p>I'm writing some code which stores some data structures in a special named binary section. These are all instances of the same struct which are scattered across many C files and are not within scope of each other. By placing them all in the named section I can iterate over all of them.</p> <p>In GCC, I use _<em>attribute</em>_((section(...)) plus some specially named extern pointers which are magically filled in by the linker. Here's a trivial example:</p> <pre><code>#include &lt;stdio.h&gt; extern int __start___mysection[]; extern int __stop___mysection[]; static int x __attribute__((section("__mysection"))) = 4; static int y __attribute__((section("__mysection"))) = 10; static int z __attribute__((section("__mysection"))) = 22; #define SECTION_SIZE(sect) \ ((size_t)((__stop_##sect - __start_##sect))) int main(void) { size_t sz = SECTION_SIZE(__mysection); int i; printf("Section size is %u\n", sz); for (i=0; i &lt; sz; i++) { printf("%d\n", __start___mysection[i]); } return 0; } </code></pre> <p>I'm trying to figure out how to do this in MSVC but I'm drawing a blank. I see from the compiler documentation that I can declare the section using __pragma(section(...)) and declare data to be in that section with __declspec(allocate(...)) but I can't see how I can get a pointer to the start and end of the section at runtime.</p> <p>I've seen some examples on the web related to doing _<em>attribute</em>_((constructor)) in MSVC, but it seems like hacking specific to CRT and not a general way to get a pointer to the beginning/end of a section. Anyone have any ideas?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload