Ответы пользователя по тегу GCC
  • Почему ассемблерный код (GNU assembler) компилируется на одной машине, но не компилируется на другой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    $ gcc -fPIC -o a.out ./1_1.s
    Параметр -fPIC не помогает

    DVoropaev у тебя уже был такой вопрос, ответ с тех пор не изменился: -fPIC изменяет ассемблерный вывод компилятора, на готовый ассемблерный файл этот ключ никак не влияет.

    movl $.hello_str, %edi

    Этот код -- 32-битный, компилируй его с ключом -m32.
    Ответ написан
    Комментировать
  • Почему не компилируется код на ассемблере в gcc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    перекомпилируйте с параметром -fPIC
    gcc -fPIC ./hello.s

    "перекомпилируйте" в данном контексте означает "сгенерируйте другой ассемблерный код".

    Код программы выглядит так:

    Ну это же явно 32-битный код, компилируй его под 32 бита:
    gcc -m32 hello.s -o hello
    Ответ написан
    3 комментария
  • Как задать значение переменной в SRAM при ее объявлении?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Фактически, по адресу 0x0060 лежит какой-то мусор, который никак не относится к тому, что я туда хотел положить.

    Откуда взялся адрес 0x0060 и как вы поняли что там лежит?

    TL;DR: код копирующий данные из FLASH в SRAM и обнуляющий .bss не линкуется по умолчанию. gcc вставляет ссылку на неопределённые символы __do_copy_data и __do_clear_bss в каждую единицу трансляции, в которой определяются объекты в секции .data и .bss соответственно. В написанных руками ассемблерных файлах их можно упомянуть явно.
    Ответ написан
  • Как сделать кросскомпиляцию gcc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    --build - платформа где будут собираться исходники какой либо программы
    --host - указываем где будет запускаться скомпиленная программа
    --target - а это как я понимаю используется чтобы указать где будет собираться сам GCC?

    Применительно к тулчейну
    - build -- это машина, на которой ты строишь тулчейн. В твоём случае configure сам определит.
    - host -- это машина на которой тулчейн будет выполняться. В твоём случае это то же самое, что build. Можно не указывать.
    - target -- это машина, под которую тулчейн будет генерировать код.

    Я их собрал с опцией (это верно в моем случае?):
    HOST=x86_64-pc-nto-qnx6.5.0

    Похоже на правду.

    Но не просто собрать, а собрать так, чтобы собранный компилятор компилировал исходники под QNX.

    Для этого тебе нужно понять, чем код, сгенерированный под QNX отличается от кода под ту же процессорную архитектуру, но под другую ОС.
    spoiler
    В основном -- библиотекой С.
    Ответ написан
    4 комментария
  • Что обозначают эти строки в ассемблере?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    .file "main.c"
    Зачем в коде название файла с исходным кодом

    Для генерации отладочной информации в формате DWARF.

    .ident "GCC: (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0"
    ...и версия моей убунты?

    Это не версия твоей убунты, это строка идентификации компилятора, в которой оказалось имя твоей ОС.

    Попадают ли они в исполняемый файл при окончательно компиляции и зачем используются?


    Имена файлов попадают в таблицу символов как символы типа FILE и в секцию отладочной информации:
    $ readelf -a hello | grep FILE
        28: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
        37: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS hello.c
        38: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
        41: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS


    Если отладочная информация включает в себя номера строк, то они тоже будут ссылаться на имя файла, ассоциируя диапазон адресов с номерм строки в конкретном исходном файле.

    Идентификационная строка компилятора попадает в секцию .comment объектного файла, а оттуда -- в исполняемый файл:
    $ objdump -s -j .comment hello
    
    hello:     file format elf64-x86-64
    
    Contents of section .comment:
     0000 4743433a 20284465 6269616e 20362e33  GCC: (Debian 6.3
     0010 2e302d31 382b6465 62397531 2920362e  .0-18+deb9u1) 6.
     0020 332e3020 32303137 30353136 00        3.0 20170516.


    Всё это можно от исполняемого файла отрезать командой strip, objcopy или соответствующим скриптом линковщика.
    Ответ написан
    Комментировать
  • Почему компиляция кода заканчивается с ошибкой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Хотя большинство этих пакетов установлено, они почему-то не определяются.

    Чтобы они определялись должны быть установлены соответствующие -dev пакеты (т.е., например, чтобы определялся libpcsclite должен быть установлен libpcsclite-dev).
    Ответ написан
  • Как увидеть входные параметры ассемблер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть исходный код на Си, который вызывает функцию на ассемблере, но передаваемые аргументы как получить,

    Гуглить словосочетание "имя целевой процессорной архитектуры" + ABI.
    Например: x86_64 abi, x86 abi, arm64 abi...
    В найденном документе искать раздел "parameter passing", "function calling" или с похожим по смыслу названием.
    Ответ написан
    2 комментария
  • Как исправить ошибку "stdio.h: No such file or directory "?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как исправить ошибку «stdio.h: No such file or directory »?

    Понять почему она возникает:
    - запустить компиляцию с опцией -v: gcc -v helloworld.c -o helloworld
    - найти в выводе строки
    #include "..." search starts here:
    #include <...> search starts here:

    - посмотреть что за каталоги идут после них, есть ли эти каталоги в твоей системе
    - посмотреть, есть ли в твоей системе stdio.h, и если есть, то где
    - написать сюда результаты выполнения предыдущих шагов.
    Ответ написан
  • GCC не работает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    gcc не компилирует ничего. И версия почему-то 2.95
    g++ всё компилирует спокойно и версия самая новая.

    Криво установил? Конфликт с другой установкой?
    Что выводят команды which gcc и which g++?
    Ответ написан
  • Как восстановить корректную работу gcc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    После установки musl-libc

    что за линукс? как устанавливал musl-libc?
    Ответ написан
  • Linker gcc PROVIDE?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    назначение ключевого слова PROVIDE в linker script

    Легко. TL;DR: это ключевое слово позволяет определить символ, если он не был определён другим способом (в линкуемых объектниках). Если был определён в объектниках -- будет использовано определение оттуда.
    Ответ написан
    Комментировать
  • Как решить ошибку при сборке пакета?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что говорят следующие две команды?
    $ /usr/bin/as
    $ ldd /usr/bin/as

    Что говорят следующие команды?
    $ touch test.c
    $ x86_64-linux-gnu-gcc -v -c test.c
    Ответ написан
  • Как это скомпилировать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как правильно собирать такое

    Проще всего -- установив -dev пакет в своей ОС:
    apt-get install libfcgi-dev
    gcc -o main main.c -lfcgi -pthread

    Если установить -dev не позволяет религия или другие ограничения, нужно указать компилятору откуда брать libfcgi, так же как вы указали откуда брать fcgiapp.h:
    gcc -I /home/user/lessons/tests/include -L/home/user/lessons/tests/lib -o main  main.cpp -ldl -lfcgi -lpthread

    Путь ...tests/lib -- условный, вам надо будет указать каталог в который установлена libfcgi.a либо libfcgi.so
    -lpthread

    Вместо -lpthread правильнее писать -pthread: -lpthread только линкует с libpthread, -pthread в добавок к этому определяет макрос _REENTRANT для исходников которые компилируются с этой опцией.
    Ответ написан
    2 комментария
  • Почему команда gcc не найдена (хотя gcc установлен)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    gсс -lgd main.c
    gсс: команда не найдена

    в слове gcc нет русских букв с.
    $ gcc
    gcc: fatal error: no input files
    compilation terminated.

    Вот тут вам удалось написать слово gcc правильно.
    $ gсс main.c
    gсс: команда не найдена

    А здесь опять с русскими с.
    Ответ написан
    Комментировать
  • Некорректное вычисление?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    выдают одинаково верный результат

    одинаково верный результат для java, потому что порядок вычисления значения выражений в java определён строго для любого выражения, см. https://docs.oracle.com/javase/specs/jls/se7/html/...

    С++ -- это другой язык, на нём можно написать выражение вроде вашего, значение которого не определено стандартом и может варьироваться в зависимости от компилятора, опций оптимизации и фазы луны. См. https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D1%87%D...
    Ответ написан
    Комментировать
  • Что означает условие?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что означает условие?
    if ! $LSS &>lss_log.txt

    Если запуск программы $LSS (определённой в начале скрипта как ./lss) закончился неудачно (ненулевым кодом выхода), выполнить тело оператора if.
    Ответ написан
    Комментировать
  • Как скомпилировать gcc (Ubuntu Toolchain) с другим --prefix?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Последний шаг выполнить так (проверил в дебиане):

    PF=opt/dev-tools-4.9 dpkg-buildpackage -rfakeroot -b
    Ответ написан
    2 комментария
  • Как скомпилировать "hello world" на с++ при помощи кросс-компиляции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как использовать кросс-компиляцию

    Ровно так же как и обычную, только вместо обычного компиятора вызывать кросс-компилятор.
    Например, нужно Hello World, написанный на c++ скомпилировать под ARM Cortex™-A7 с помощью gcc. Как это сделать?

    arm-buildroot-linux-gnueabi-gcc hello-world.c -o hello-world

    Если у вас есть какая-то система сборки -- смотреть документацию системы сборки о том, как указать архитектуру и компилятор.
    Например, для autotools нужно вызвать ./configure --target=arm-linux-gnueabi CC=arm-buildroot-linux-gnueabi-gcc
    (или --host=arm-linux-gnueabi, зависит от самого приложения).
    Ответ написан
    Комментировать
  • Что будет, если повторить два параметр оптимизации в GCC с разными значениями?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Для большинства опций -- будет переписано последним переданным значением. В частности это справедливо для -march и -mtune на x86.
    Но в общем случае может быть что угодно, поскольку gcc может преобразовывать одни опции в другие согласно своим спекам перед вызовом собственно компилятора.
    Ответ написан
    Комментировать
  • Странное поведение STM32L152RB в разных партиях(?), какое значение _estack должно быть в ld скрипте?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Надо смотреть, как именно символ _estack используется кодом.
    Ищите объектник или либу со ссылкой на этот символ как на неопределённый и смотрите в исходник или дизассемблер.
    Ответ написан
    Комментировать