LINUX.ORG.RU

Как правильно добавить опцию в вызов gcc

 , , , ,


0

1

Существует некая среда разработки Xilinx ISE, имеющая ограниченную поддержку под линукс. В ходе работы с ней вызывается симулятор схемы, который собирает из исходных кодов verilog/vhdl некие .С-файлы, и затем, для симуляции компилирует их при помощи GCC.

В логе это выглядит следующим образом:

Compiling isim/Barrel_Shifter_isim_beh.exe.sim/work/m_02392917152912931626_1577402672.c to isim/Barrel_Shifter_isim_beh.exe.sim/work/m_02392917152912931626_1577402672.lin64.o with command:
"/usr/bin/gcc" -Wa,-W  -O  -fPIC  -m64  -c -o "isim/Barrel_Shifter_isim_beh.exe.sim/work/m_02392917152912931626_1577402672.lin64.o" -I"/opt/Xilinx/14.7/ISE_DS/ISE/./data/include" "isim/Barrel_Shifter_isim_beh.exe.sim/work/m_02392917152912931626_1577402672.c"

Прошу заметить, что gcc вызывается по абсолютному пути «/usr/bin/gcc».

Исходно, он при этом выдает ошибку «Implicit function geclaration», после чего, из-за наличия ошибки, дальнейшая симуляция не запускается.

«Ошибка» в .С файлах вызвана тем, что подготовка их из исходников verilog/vhdl происходит без явного написания прототипов. Что по сути не критично и может быть погашено вызовом gcc c опцией «-Wno-implicit».

Я стал думать как это исправить:

  1. Повлиять я внутреннюю работу среды я вроде как не могу, а вот повлиять на запуск компилятора — могу.

  2. Однако, оказывается, CFLAGS и прочие переменные среды — это лажа, так как gcc их не смотрит.

  3. Я думал, можно перед запуском среды разработки дополнить PATH cпереди:

    #export PATH=«somedir:$PATH»

и положить скрипт:

somedir/gcc

#!/bin/sh
exec /usr/bin/gcc -Wno-implicit $*

Однако, как было выше сказано, среда запускает gcc по абсолютному пути.

  1. Пришлось сделать:

    #mv /usr/bin/gcc /usr/bin/_gcc

/usr/bin/gcc

#!/bin/sh
exec /usr/bin/_gcc -Wno-implicit $*

Это, естественно, работает, но, по сути своей — ужасно.

Вопрос: как сделать это правильно?



Последнее исправление: marxengels (всего исправлений: 6)
Ответ на: комментарий от cobold

Да нет, это настоящий бинарник.

$ls -l /usr/bin/_gcc                                                                                 
-rwxr-xr-x 3 root root 2172960 авг  5 23:49 /usr/bin/_gcc
$file /usr/bin/_gcc                                                                                   
/usr/bin/_gcc: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=80241bb2708ae5737e541e763b537200d5045d69, for GNU/Linux 4.4.0, stripped

Мой вопрос ведь заключается в том, что перемещать и замещать системные бинарники это очень плохо. Как можно решить задачу более локально, в рамках запуска среды.

marxengels
() автор топика
Ответ на: комментарий от dataman

Искал, не нашел. Там gcc вызывается изнутри какого то то ли «ISim», то ли «fuse»…

Ни в директории проекта, ни в директории установки среды нет ни е единого текстового файла, содержащего «gcc». Так что возможность повлиять на его вызов изнутри – минимальная.

Xilinx давно уже забросил эту среду, в новых там все гораздо лучше и прозрачнее, но старые плисы поддерживаются только в этой среде…

marxengels
() автор топика
Последнее исправление: marxengels (всего исправлений: 4)

Прошу заметить, что gcc вызывается по абсолютному пути «/usr/bin/gcc».

Можно в бинаре строку /usr/bin/gcc заменить на gcc, может прокатит (зависит от вызываемой функции exec*, которую, кстати, тоже можно попробовать поменять)

utf8nowhere ★★★
()
Ответ на: комментарий от marxengels

Повлиять я внутреннюю работу среды я вроде как не могу

А в самой среде нет настроек переменных?


Сделано пунктом 4.

Точно! Всё не читаю, сразу отвечаю. :)

dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 2)

Ну если он действительно вызывает /usr/bin/gcc, то только так. Но скорей всего ты что-то понял не так и в PATH он смотрит, просто ты его не смог правильно поменять.

PS перепиши этот скрипт как

#!/bin/sh
exec /usr/bin/_gcc $GCCFLAGS "$@"
vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)

Это тихий ужас. Используй докер, если в твоем некро-дистре gcc древний:

docker run --rm -v $(pwd):/usr/src/myapp -w /usr/src/myapp gcc:latest gcc -o myapp main.c

Вариант #2:

Настрой сборку через Github.

rtxtxtrx ★★
()

А вообще суть проблемы в том, что ты исползуешь gcc непонятно какой версии, вместо рекомендуемой. Прочитай инструкцию к программе и используй софт рекомендуемых версий. На одну проблему ты уже напоролся, на сколько ещё напорешься - неизвестно. В старом gcc такой код не вызывал ошибку компиляции, это 100%.

vbr ★★★★
()
Ответ на: комментарий от dataman

Симулятор получает для отрисовки сигналы (метки времени) – выходные данные той программы, которую gcc и пытается собрать. Так что это все происходит уже гораздо позднее.

marxengels
() автор топика
Последнее исправление: marxengels (всего исправлений: 1)
Ответ на: комментарий от marxengels

Но можно предположить Xilinx ISE 14.7 — 2013 год

Варезная?
Тут есть продолжение – Vivado 2024.1: Lab Edition - Linux (TAR/GZIP - 1.53 GB).
Понятия не имею, будет ли работать без регистрации.

dataman ★★★★★
()
Ответ на: комментарий от dataman

Как и было сказано (Как правильно добавить опцию в вызов gcc (комментарий)):

Xilinx давно уже забросил эту среду, в новых там все гораздо лучше и прозрачнее, но старые плисы поддерживаются только в этой среде…

marxengels
() автор топика

Вопрос: как сделать это правильно?

Ответ:

Xilinx ISE это проприетарное ПО. Вам надо обратиться в службу поддержки производителя ПО. Это правильно.

Служба поддержки, скорее всего, пошлет Вас на три буквы. Это тоже правильно.

xisosun
()

Подытожим возможные варианты:

  1. тупо подменить /usr/bin/gcc – сделано, работает; но такое решение пугает.

  2. контейнер/докер

  3. исследовать более подробно вызов (path)

  4. копаться в бинарниках ise/isim

marxengels
() автор топика
Последнее исправление: marxengels (всего исправлений: 1)
Ответ на: комментарий от marxengels

тупо подменить /usr/bin/gcc – сделано, работает; но такое решение пугает.

Вообще, в большинстве дистрибутивов /usr/bin/gcc является симлинком, который управляется update-alternatives или аналогичным механизмом. В таком случае можно было бы переключить его на свой скрипт, и это было бы вполне солидным решением.

копаться в бинарниках ise/isim

Так а что там копаться, grep -R /usr/bin/gcc --files-with-matches <путь к инсталляции>

annulen ★★★★★
()
Ответ на: комментарий от annulen
Ну только не в арче. В арче все просто.

$ file /usr/bin/gcc                                                                               
/usr/bin/_gcc: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=80241bb2708ae5737e541e763b537200d5045d69, for GNU/Linux 4.4.0, stripped

$ pkgfile -s /usr/bin/gcc                                                                          
core/gcc

$ pacman -Qi gcc                                                                               
Name            : gcc
Version         : 14.2.1+r32+geccf707e5ce-1
Description     : The GNU Compiler Collection - C and C++  frontends
Architecture    : x86_64
URL             : https://gcc.gnu.org
Licenses        : GPL-3.0-with-GCC-exception  GFDL-1.3-or-later
Groups          : None
Provides        : gcc-multilib
Depends On      : gcc-libs=14.2.1+r32+geccf707e5ce-1 binutils>=2.28  libmpc  zstd  libisl.so=23-64 
Optional Deps   : lib32-gcc-libs: for generating code for 32-bit ABI [installed]
Required By     : clang  dkms
Optional For    : node-gyp  xorg-xrdb
Conflicts With  : None
Replaces        : gcc-multilib
Installed Size  : 202,28 MiB
Packager        : Frederik Schwan <freswa@archlinux.org>
Build Date      : Пн 05 авг 2024 23:49:41
Install Date    : Сб 07 сен 2024 22:32:01
Install Reason  : Installed as a dependency for another  package
Install Script  : No
Validated By    : Signature

Однако, применительно к интересующей меня среде разработки оно вшито белыми нитками:

$ grep -R /usr/bin/gcc --files-with-matches /opt/Xilinx/14.7/ISE_DS                       
/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin/unwrapped/fuse
/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin/unwrapped/vhpcomp
/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin/unwrapped/vlogcomp
/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64/unwrapped/fuse
/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64/unwrapped/vhpcomp
/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64/unwrapped/vlogcomp
/opt/Xilinx/14.7/ISE_DS/ISE/sysgen/lib/lin/libsysgen.so
/opt/Xilinx/14.7/ISE_DS/ISE/sysgen/lib/lin64/libsysgen.so
/opt/Xilinx/14.7/ISE_DS/ISE/sysgen/bin/lin/TclProxyServer.bin
/opt/Xilinx/14.7/ISE_DS/ISE/sysgen/bin/lin/sysgen.mexglx
/opt/Xilinx/14.7/ISE_DS/ISE/sysgen/bin/lin64/sysgen.mexa64
/opt/Xilinx/14.7/ISE_DS/ISE/sysgen/bin/lin64/TclProxyServer.bin

 Вот как раз три бинарника -- это и есть "компиляторы", запускающиеся между средой и симулятором.
marxengels
() автор топика
Последнее исправление: marxengels (всего исправлений: 4)
Ответ на: комментарий от marxengels

тебе написали про докер, но ты еще 100500 сообщений напиши вместо того чтобы просто пару команд запустить

https://github.com/chriz2600/xilinx-ise

rtxtxtrx ★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 2)
Ответ на: комментарий от etwrq

Там такого нет. Проект это проект. Он посвящен синтезу схемы и прошивки, он открывается и живет в среде (ise)

Симулятор это параллельная задача. Он вызывается из среды единственно кнопочкой и больше отношения к ней не имеет. Причем, как выясняется, между средой ise и симулятором (отрисовщиком результатов) isim существует прокладка-«компилятор» — fuse. А в него железно вшит вызов ‘/usr/bin/gcc’.

marxengels
() автор топика
Последнее исправление: marxengels (всего исправлений: 1)
Ответ на: комментарий от rtxtxtrx

Так это понятно.

Вопрос был направлен на сбор вариантов решения задачи средствами нашего любимого онтопика. Простыми классическими механиками.

А в самом простом случае и подмена бинарника gcc работает, если для личного пользования и если об этом помнить – вполне годится.

marxengels
() автор топика
Ответ на: комментарий от marxengels

Вопрос был направлен на сбор вариантов решения задачи средствами нашего любимого онтопика. Простыми классическими механиками.

Ещё можно через mount --bind смонтировать другой файл поверх /usr/bin/gcc.

annulen ★★★★★
()