glib c #define PTR_MANGLE (var) синтаксис - PullRequest
2 голосов
/ 20 марта 2020

Я читаю , как работает защита указателя, и смотрю на glib c макрос , который это делает :

#  define PTR_MANGLE(var)        asm ("xor %%fs:%c2, %0\n"                      \
                                     "rol $2*" LP_SIZE "+1, %0"                      \
                                     : "=r" (var)                              \
                                     : "0" (var),                              \
                                       "i" (offsetof (tcbhead_t,              \
#  define PTR_DEMANGLE(var)        asm ("ror $2*" LP_SIZE "+1, %0\n"              \
                                     "xor %%fs:%c2, %0"                              \
                                     : "=r" (var)                              \
                                     : "0" (var),                              \
                                       "i" (offsetof (tcbhead_t,              \
                                                      pointer_guard)))

Синтаксис немного крипти c, поэтому мне трудно понять, как PTR_DEMANGLE в конечном итоге создает ассемблерный код, подобный этому:

ror    rdx,0x11
xor    rdx,QWORD PTR fs:0x30
call   rdx

Как здесь работает подстановка строк? Что означает : в этом контексте? (Я не вижу условного присвоения?)

...