Как определить конфигурацию gcc из скрипта bash? - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть скрипт bash, который также компилирует программу в более старых версиях Ubuntu (14.04.x ​​и 16.04.x), чем в последней (18.04.x), и в других дистрибутивах (Arch, CentOS, Debian, Fedoraи т. д.) и поэтому ... с другими настройками gcc.

Затем, чтобы получить исполняемый файл, который можно запустить (среди прочего) двойным щелчком, я должен скомпилировать эту программу без "-no"-pie "опция с более старыми версиями настройки gcc (Ubuntu 14.04.x ​​и 16.04.x), когда мне нужно использовать эту опцию" = no-pie "для новой версии настройки gcc 7.3 (в Ubuntu 18.04.x).

Проблема в том, что в последнем выпуске Ubuntu (18.04.x) и его производных (Kubuntu, Xbuntu и т. Д. И, возможно, с другими дистрибутивами) с новой конфигурацией gcc (7.3) есть опция "--enable-default-pie ", если я скомпилирую свою программу без опции" -no-pie ", в результате получается, что созданный файл представляет собой исполняемый файл типа" общая библиотека ", который не может быть запущен двойнымнажмите.

Мой вопрос:

a) Есть ли команда, которая позволяет мне определить из сценария bash, настроен ли gcc с параметром --enable-default-pie?

b) если нет, есть ли команда, которая позволяет мне из сценария bash определить, относится ли скомпилированный файл к типу «разделяемая библиотека» или «исполняемый файл»?

Для этого второго варианта:Решением может быть то, как сохранить ответ «gcc -v» в файле .txt и проверить, есть ли строка «--enable-default-pie», но я абсолютно не знаю, как это сделать.

Если у меня нет ответа на мой первый вариант, второй вариант (правда, менее элегантный, но столь же эффективный) позволит мне сначала скомпилировать программу без опции "-no-pie", а затем проверитьсостояние такого созданного исполняемого файла и, если результатом является «разделяемая библиотека», перезапустите эту компиляцию на этот раз, используя опцию «-no-pie», чтобы, в одном случае, как и в другом, получить исполняемый файл, который можно запуститьдвойным щелчком мыши независимо отнастройка gcc может быть.

Заранее благодарим вас за ваше время, идеи и предложения.

С уважением.

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Рекомендованный способ проверить поддержку PIE - скомпилировать такой код C

#if defined __PIC__ || defined __pic__ || defined PIC || defined pic            
# error PIC is default.                                                         
#endif                                                                          

с запрошенными флагами компилятора и проверить, есть ли ошибка.Если вам требуется специальная обработка для PIE, он распознает PIE, если он был указан с помощью переменных CC или CFLAGS, даже если это не сразу видно.Например, по техническим причинам Fedora скрывает флаги PIE за аргументом -specs .

0 голосов
/ 02 октября 2018

К сожалению, комментарии не позволяют CR + LF (для отображения предварительно отформатированного текста).

Ниже приведен мой отформатированный перевод вашей команды настройки gcc:

check_gcc_setting()
{

    if [ -n "`gcc -v -E 2>&1 | grep 'Configured with' | sed 's/--/\n--/g' | grep enable-default-pie`" ]
        then
            GCC_SETTING="1"
        else
            GCC_SETTING="0"
    fi
    read -p "The gcc setting is $GCC_SETTING " GCCRESULT
}

Ниже приведен результат:

whatfile { file $1 -i | grep application | sed 's/^.*application\/x-//g;s/,.*$//g'; }
-bash: syntax error near unexpected token `}'
0 голосов
/ 30 сентября 2018

Да, вы можете проверить параметры сборки GCC с помощью gcc -v или gcc -###

. Чтобы получить красивую печать, вы можете использовать:

gcc -### -E 2>&1 | grep "Configured with" | sed 's/--/\n--/g'

Так что bash oneliner скажет ваместь пирог или нет, может быть:

if [[ -n "`gcc -v -E 2>&1 | grep 'Configured with' | sed 's/--/\n--/g' | grep enable-default-spie`" ]]; then echo "PIE DEFAULT"; else echo "PIE NOT DEFAULT"; fi

Чтобы проверить тип файла, просто используйте команду file, например ::

file /usr/bin/x86_64-linux-gnu-gcc-7

/ usr / bin / x86_64-linux-gnu-gcc-7: ELF 64-битный LSB исполняемый файл , x86-64, версия 1 (SYSV), динамически связанный, интерпретатор /lib64/ld-linux-x86-64.so.2, дляGNU / Linux 3.2.0, BuildID [sha1] = 02ac46ba938c15f55f6fab165133e0f527bc2197, раздетый

file /usr/lib/libchm.so.1.0.0

/ usr / lib / libchm.so.1.0.0: ELF 64-разрядный LSB общий объект , x86-64, версия 1 (SYSV), динамически связан, BuildID [sha1] = 7c603d9a0771b5bfd5b869b4446e2f78ef13802a, раздет

Тип функции файла

function whatfile { file $1 -i | grep application | sed 's/^.*application\/x-//g;s/,.*$//g'; }

Примервывод:

aaa@xxx:~ $ whatfile /boot/grub/grub.conf
aaa@xxx:~ $ whatfile /usr/lib/libnss3.so
sharedlib
aaa@xxx:~ $ whatfile /bin/zcat
executable
...