Что означает "#APP" в файле сборки, сгенерированном компилятором? - PullRequest
0 голосов
/ 28 декабря 2018

Я написал следующий код:

// a.c
#include <stdlib.h>
#include <sys/syscall.h>
#include <unistd.h>

_Noreturn void _start()
{
    register int syscall_num asm ("rax") = __NR_exit;
    register int exit_code   asm ("rdi") = 0;

    // The actual syscall to exit
    asm volatile ("syscall"
        : /* no output Operands */
        : "r" (syscall_num), "r" (exit_code));
}

А затем скомпилировал его, используя clang-7 -Oz -pipe -flto -c a.c, и использовал llc-7 -filetype=asm a.o, чтобы превратить его в читаемый человеком файл сборки a.o.s:

    .text
    .file   "a.c"
    .globl  _start                  # -- Begin function _start
    .type   _start,@function
_start:                                 # @_start
    .cfi_startproc
# %bb.0:
    pushq   $60
    .cfi_adjust_cfa_offset 8
    popq    %rax
    .cfi_adjust_cfa_offset -8
    xorl    %edi, %edi
    #APP
    syscall
    #NO_APP
    retq
.Lfunc_end0:
    .size   _start, .Lfunc_end0-_start
    .cfi_endproc
                                        # -- End function

    .ident  "clang version 7.0.1-svn348686-1~exp1~20181211133235.57 (branches/release_70)"
    .section    ".note.GNU-stack","",@progbits

В приведенной выше сборке директива #APP появляется перед syscall, то есть сборкой, которую я написал, а директива #NO_APP появляется сразу после нее.

Я знаю, что она должна иметь что-то дляделать с использованием asm, например, чтобы предотвратить его оптимизацию, но я не могу найти какую-либо документацию по нему после поиска в Google.

Спасибо, продвинулись.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Исторически, по крайней мере, компилятор сказал as, что он может использовать режим быстрого анализа для анализа чистого вывода компилятора, переключаясь обратно для полного анализа блоков из inline-asm.Где-то в начале файла должен быть #APP, который входит в этот режим.#NO_APP отключается из этого режима.

Я не уверен, as больше ничего не делает с этим намеком, поэтому он может даже не искать #NO_APP, а просто обращаться с ним как с любымдругой комментарий.

На практике он разделяет блок текста, полученный из встроенного шаблона asm, против сгенерированного компилятором asm .Он ничего не делает кроме этого, и если вы по какой-то причине редактируете asm вручную, вполне можно удалить его.

0 голосов
/ 28 декабря 2018

Удаляет пробел и комментарии между ним и # NO_APP.

В этом случае он был размещен здесь на всякий случай, так как у вас есть комментарий в asm ()

...