После более глубокого взгляда я наконец нашел причину:
в зависимости от выбранного базового SDK и цели развертывания, GCC использует разные системные библиотеки и общий объект библиотеки времени выполнения (crt1.o)
SDK10.4, Target10.4: /Developer/SDKs/MacOSX10.4u.sdk/usr/lib/crt1.o
SDK10.5, Target10.4: /Developer/SDKs/MacOSX10.5.sdk/usr/lib/crt1.o
SDK10.5, Target10.5: /Developer/SDKs/MacOSX10.5.sdk/usr/lib/crt1.10.5.o
SDK10.6, Target10.4: /Developer/SDKs/MacOSX10.6.sdk/usr/lib/crt1.o
SDK10.6, Target10.5: /Developer/SDKs/MacOSX10.6.sdk/usr/lib/crt1.10.5.o
SDK10.6, Target10.6: /Developer/SDKs/MacOSX10.6.sdk/usr/lib/crt1.10.6.o
Эти объектные файлы содержат начальную команду загрузки потока UNIX с указанными состояниями регистров. Если выбранный SDK и цель развертывания 10.4 (первая строка), то CS, DS, ES, SS будут отличаться от 0.