Компиляторы идут со своими реализациями стандартной библиотеки. Просто в Linux предполагается, что любой компилятор будет следовать тем же соглашениям, что и версия GCC, скомпилировавшая библиотеку.
Что касается совместимости, это может быть проще, чем вы думаете. Существуют установленные соглашения о вызовах, которые позволят компиляторам производить допустимый вызов функции, даже если функция не была скомпилирована с тем же программным обеспечением.
Что касается структур и отступов, вы заметите, что большинство фреймворков работают с непрозрачными типами, то есть указателями на структуры. Часто структура структуры даже не доступна для клиентов. Таким образом, они никогда не работают с фактическими данными, а только с указателями на данные, что устраняет проблему с заполнением.