Make sure your records are all packed C, like:
{$IFDEF FPC}{$PACKRECORDS C}{$ENDIF}
type
ifmap = packed record // declare ALL records as packed, also all child records.
mem_start : dword;
mem_end : dword;
base_addr : word;
irq : byte;
dma : byte;
port : byte;
end;
Here your original code works (as root). I only added all the
packed and changed
char to
byte because a C char is actually a byte.
If you do not use packed, a record uses natural alignment. You *must* use packed afaik.