1. Despite the comment, aren't the u_int fields of different sizes in
32- vs 64-bit builds? The comment seems to be somewhat misleading.
u_int is 32 bits in both ILP32 and LP64, so it is fine. It would have
been better to use uint32_t instead.
2. Is there any assurance that the module's load address (in ms_addr)
can fit in a uint64_t?
Yes, for all platforms (currently). If it was uintptr_t be it would have
been different size in ILP32/LP64.
3. If I wanted to add another address field (ms_modaddr for the address
of the module's 'struct module'), would it be better to
a) insert a new uint64_t in the middle of this structure,
after the current ms_addr field,
b) insert a new uint64_t in the middle of this structure,
immediately before the ms_reserved[] array,
c) append a new uint64_t at the end of this structure, or
d) replace some number of the ms_reserved[] array with a
new uint64_t structure (and how many to replace?)
You need to replace 2 u_ints (each u_int has 4 bytes and you need
8 bytes for a uint64_t).