Почему сегмент 0x1F особенный в OSX? - PullRequest
1 голос
/ 01 октября 2010

Некоторые из исполняемых файлов Mach-O имеют команду LC_UNIXTHREAD со следующими начальными значениями регистра:

cmd LC_UNIXTHREAD
    cmdsize 80
     flavor i386_THREAD_STATE
      count i386_THREAD_STATE_COUNT
        eax 0x00000000 ebx    0x00000000 ecx 0x00000000 edx 0x00000000
        edi 0x00000000 esi    0x00000000 ebp 0x00000000 esp 0x00000000
        ss  0x0000001f eflags 0x00000000 eip 0x00002788 cs  0x00000017
        ds  0x0000001f es     0x0000001f fs  0x00000000 gs  0x00000000

eip настроен на точку входа приложения, но по некоторым причинам остальные также имеют специальное начальное значение. (Если все они равны нулю, приложение аварийно завершает работу, потому что некоторые из malloc () не возвращаются с чистой областью памяти.) Есть идеи о загадочном сегменте 0x1F?

Ответы [ 3 ]

1 голос
/ 05 октября 2010

Что в этом загадочного?Вам нужны действительные селекторы для CS, DS, SS:)

selector 0x17: RPL3, LDT, descriptor index 0x10
selector 0x1F: RPL3, LDT, descriptor index 0x18

Windows (по крайней мере, win7-32bit) использует следующие два:

CODE: 0x1B - RPL3, GDT, descriptor index 0x10
DATA: 0x23 - RPL3, GDT, descriptor index 0x20
0 голосов
/ 04 сентября 2013

CS должен быть установлен на селектор с включенным флагом X. DS, ES являются сегментами данных и, следовательно, указывают на другой селектор. FS, GS тоже разные. Я не уверен насчет Mac OS, но в Windows эти два используются для очень специфических вещей:

Win32: FS используется для хранения информации о процессе (FS: [30] = PEB, FS: [0] = SEH Info) Win64: GS используется вместо FS, остальные более или менее одинаковы.

В некоторых приложениях в Mac OS X вы увидите, что GS имеет значение 0x0F, а FS установлен на ноль, есть вероятность, что GS: [XXX] содержит информацию о процессе.

0 голосов
/ 17 декабря 2010

После более глубокого взгляда я наконец нашел причину: в зависимости от выбранного базового 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...