Прямая ссылка (_telldir) - PullRequest
       28

Прямая ссылка (_telldir)

0 голосов
/ 04 октября 2019

В файле /usr/include/dirent.h MacOSX10.14 я вижу эту строку:

struct _telldir;        /* forward reference */

В этом же файле используется идентификатор:

 struct _telldir *__dd_td;

Больше нигде во включаемых файлах не определено _telldir, но в том же файле объявлена ​​функция telldir:

long telldir(DIR *) __DARWIN_ALIAS_I(telldir);

Я вижу, что макрос __DARWIN_ALIAS_I определен как

#define __DARWIN_ALIAS_I(sym)       __asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03)**

Я понимаю, что это"встроенный ассемблер" и что это определяет _telldir, но я хотел бы узнать больше об этом определении.

Заранее спасибо

1 Ответ

0 голосов
/ 04 октября 2019

Это не совсем встроенный asm, как в инструкциях , это просто переопределение искажения имен для имен символов. (Например, static int foo в MacOS обычно имеет символьное имя _foo. Например, в выводе asm компилятора у вас будет _foo: .long 0).

В GNU C int foo asm("foobar"); имеет имя символа asm из foobar вместо значения по умолчанию _foo. См. https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html и этот SO-ответ: Добавление начальных подчеркиваний к символам сборки с помощью GCC на Win32?

Попробуйте сами на https://godbolt.org/, если вам интересно.


В этом случае у нас есть C строка конкатенации строк препроцессора из расширений макросов. например,

"_" "telldir" "_ino64"

в точности соответствует "_telldir_ino64" во всех контекстах, включая
long telldir(DIR *dirp) asm("_" "telldir" "_ino64");

. Этот вариант использования, по-видимому, выбирает реализацию telldir в libcустановив имя на основе нескольких других макросов CPP. Таким образом, если __DARWIN_SUF_64_BIT_INO_T определено как "_ino64", а __DARWIN_SUF_UNIX03 определено как пустое или /**/, тогда для имени символа будет установлено значение "_telldir_ino64"

(понятия не имею, как MacOS обычно определяет эти символыдругие макросы, но синтаксис отображаемой строки - просто конкатенация строковых литералов внутри asm("") для установки имени символа.)

...