`file`, почему исполняемые файлы не указаны как исполняемые? - PullRequest
2 голосов
/ 04 апреля 2020

В GNU / Linux Debian 9.9 (растяжка) моя программа сообщается как:

build/debug/program_g:              ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=be082fb3..., not stripped
build/debug/stripped_program_g:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=be082fb3..., stripped
build/release/program:              ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=6477469..., stripped
build/release/program_not_stripped: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=6477469..., not stripped

Компилятор G CC (ванильный дистрибутив, т.е. gcc (Debian 6.3.0-18+deb9u1) 6.3.0 2017051), флаги для "release" :

 -ansi -pedantic -Wall -Wextra -Werror -Wunused-result -Wmissing-include-dirs 
 -Wparentheses -std=c89 -DPROGRAM_USE_STD_C89 -O2 -DNDEBUG

Для «отладки»:

 -ansi -pedantic -Wall -Wextra -Werror -Wunused-result -Wmissing-include-dirs 
 -Wparentheses -std=c89 -DPROGRAM_USE_STD_C89 -O0 -g -fprofile-arcs -ftest-coverage -DTRACE_U0 -DTRACE_U1 -no-pie

Вопрос, почему для «выпуска» исполняемый файл указывается как shared object вместо executable?

1 Ответ

2 голосов
/ 04 апреля 2020

Потому что

1. Вы используете опцию -no-pie с вашей "отладочной" сборкой. Построение независимых от позиции исполняемых файлов (-pie) используется по умолчанию в последних Linux дистрибутивах. Почему вы отключаете его в отладочных сборках?

2. Программа file в вашей системе (Debian stretch) не знает о исполняемых файлах P IE. Более новые версии его файлов magi c будут правильно идентифицировать его как pie executable.

Пример (/mnt/old - это Debian 9.9 root fs):

$ cc -xc - <<<'int main(){}'

$ file -m /mnt/old/usr/share/misc/magic a.out
a.out: ELF 64-bit LSB <b>shared object</b>, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=df3780407016f3ea1a936c35d786288b1c0d4486, not stripped

$ file a.out
a.out: ELF 64-bit LSB <b>pie executable</b>, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=df3780407016f3ea1a936c35d786288b1c0d4486, not stripped
...