Iterator-like interface for extracting records from a blob
Some random comments:


The behaviour of flexible array members are defined in the C99 standard, but undefined in C90. Because of that reason, you might want to add a compiler switch guard against C90 compilers:

#if !defined __STDC_VERSION__ || (__STDC_VERSION__ &lt; 199901L)
  #error Code must be compiled as C99 or later.
#endif

Why is the data binary data char and not uint8_t? char may or may not be signed, depending on the compiler.
Consider inlining get_next_obj(). Since you return the struct by value, even good C compilers will generate a lot of overhead code from that. If you can weed out at least the internal return-by-value, the algorithm will be a bit faster.
Any reason why the record objects can't hold a prev pointer? That is, why can't they be a double-linked list instead of a single linked one? And on the topic of linked lists, you may want to consider changing the type of the next pointer:

typedef struct record_ {
    uint32_t id;     // id
    char *key;       // pointer to key in the blob
    char *value;     // pointer to value in the blob
    record_ *next;   // pointer to the next record 
    record_ *prev;   // pointer to the previous record
} record;  


Or perhaps stuff all the record objects into a real linked list ADT.