Ответы пользователя по тегу GCC
  • В чем проблема не нахождения ссылок на функции*?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    При сборке проекта, возникает ошибка ненахождения метода.

    Убедись, что -lboost указан после -lcpprest в команде линковки.
    Ответ написан
  • Экспортирование функций из .so библиотеки?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Та же проблемаа, нету функции exported_test_function в таблице экспорта, как исправить?

    Я делаю так, функция на месте:
    $ cat > 1027136.cс
    __attribute__((visibility("default"))) bool exported_test_function()
    {
            return true;
    }
    $ g++ -fPIC -shared 1027136.cc -o 1027136.so
    $ objdump -T 1027136.so
    
    1027136.so:     file format elf64-x86-64
    
    DYNAMIC SYMBOL TABLE:
    0000000000000000  w   DF *UND*  0000000000000000  GLIBC_2.2.5 __cxa_finalize
    0000000000000000  w   D  *UND*  0000000000000000              _ITM_deregisterTMCloneTable
    0000000000000000  w   D  *UND*  0000000000000000              __gmon_start__
    0000000000000000  w   D  *UND*  0000000000000000              _ITM_registerTMCloneTable
    00000000000010f5 g    DF .text  000000000000000b  Base        _Z22exported_test_functionv

    Что за платформа, как выполняется сборка?
    Ответ написан
  • Что больше? 1073741024 или 2147483648?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    на сегодня уже хватит программирования?

    на сегодня уже хватит программирования. Речь о размере объекта (в байтах), а каждый элемент массива int наверняка занимает хотя бы 4 байта.
    Ответ написан
    Комментировать
  • Как вызвать из C++ программы функции на ассемблере?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Как вызвать из C++ программы функции на ассемблере?

    extern "C" void number1();
    …
    int main()
    {
    number1();
    }

    Именно так.
    Ответ написан
    Комментировать
  • Какие должны быть параметры -L для gcc линкера если используется параметр sysroot?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    -L путь должен быть полным путем в моей хост машине где производится кросс компиляция или путь относительно пути указанного в параметре sysroot?

    Путь может быть полным путём на хост-машине, либо, если он начинается с символа = либо строки $SYSROOT ($SYSROOT не должен быть интерпретирован оболочкой и должен попасть в таком виде в аргументы компилятора), он интерпретируется относительно sysroot.

    См. https://gcc.gnu.org/onlinedocs/gcc/Directory-Optio... и https://man7.org/linux/man-pages/man1/ld.1.html
    Ответ написан
    2 комментария
  • Как встроить dll в exe?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    а вот остальные не могу

    Так а просто -static? Это не "встроит dll в exe" а слинкует со статической версией всех библиотек.
    Ответ написан
    2 комментария
  • Как запретить vs code отлаживать glibc?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Как запретить VSC отлаживать такие вещи?

    Непонятно, чего именно вы хотите. Чтоб отладка не заходила в libc? Используйте step over вместо step into. Выбраться из дебрей libc если выполнение остановилось внутри по точке останова по доступу к данным? Используйте finish чтобы остановиться после выхода из функции.
    Ответ написан
  • Как переделать код для ICCARM в GNUC?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Нужно его переделать для GCC.

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

    Возможно реакции требует только 1 строчка после ифа.

    Возможно. Но отсюда не видно. Поместить переменную в нужную секцию в gcc можно атрибутом __attribute__((section("имя секции"))). См.
    Ответ написан
  • Как задать поведение препроцессора C в GCC?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Смысл его прост: отменить действие макроса в определенной части кода, а по ее истечении восстановить этот макрос.

    Таким образом этого сделать нельзя. Потому что в месте где написано #define temp func значение макроса func не подставляется. В temp попадает буквально слово func. После #undef func содержимое макроса func будет потеряно. Это поведение предписано стандартом, мне неизветсны опции компилятора, которыми его можно было бы изменить. См. eelis.net/c++draft/cpp.replace#10 и eelis.net/c++draft/cpp.rescan

    Но если внести ещё один уровень косвенности, то можно сделать чтобы это работало. Например:
    #define foo bar
    #define func foo
    ...
    #undef func
    ...
    #define func foo
    Ответ написан
    3 комментария
  • Как заставить GCC не использовать SSE-инструкции с выравниванием для операндов в стеке?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Логичнее было бы воспользоваться опцией -mstackrealign чтобы выравнивать стек на входе в функцию.
    Ответ написан
    2 комментария
  • Как в gcc сохранять объектные файлы(в другой папке)?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Как в gcc сохранять объектные файлы

    Опция -o -- путь к результату, препроцессирования/компиляции/линковки. Научи свой Makefile подставлять правильный путь в эту опцию.
    Ты скажешь "а у меня 100500 исходных файлов компилируется разом". Ответ -- а не надо так делать. Компилятор всё равно вызывается каждый раз новый. Напиши правило компилирующее один файл в нужный каталог -- и выполни его по разу для каждого исходника. Например так:
    NAME = calc
    
    SRC = main.c \
      parser.c \
      ft_lib/ft_atoi.c \
      ft_lib/ft_putchar.c \
      ft_lib/ft_putnbr.c
    
    BUILDDIR=build
    OBJ = $(addprefix $(BUILDDIR)/,$(subst /,_,$(patsubst %.c,%.o,$(SRC))))
    
    FLAGS = #-Wall -Wextra -Werror
    
    all: $(NAME)
    
    $(NAME): $(OBJ)
      gcc $(OBJ) -o $(NAME)
    
    define CC_RULE =
    $(BUILDDIR)/$(subst /,_,$(patsubst %c,%o,$(SOURCE))): $(SOURCE)
      gcc $(FLAGS) -c $< -o $@
    endef
    
    $(foreach SOURCE,$(SRC),$(eval $(call CC_RULE,$(SOURCE))))
    
    clean:
      rm -f $(OBJ)
    
    fclean:
      rm -f $(NAME)
    
    re: fclean all


    Смотри: я сделал список объектников из $(SRC), написал генератор CC_RULE, который для любого исходника генерирует правило компиляции его в объектник под $(BUILDDIR) и вызвал его для всех исходников в $(SRC).

    Это забавное развлечение, но гораздо практичнее воспользоваться существующей системой сборки: autotools/CMake/...
    Ответ написан
    4 комментария
  • Что за ошибка в коде вложенного ассемблера?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    asm (
        "mov a, %eax \n\t"
        "mov b, %ebx \n\t"
        "add %eax, %ebx \n\t"
        "mov %ebx, c \n\t"
      );


    Так в gcc не работает. Должно быть например так:
    asm (
        "mov %[a], %%eax \n\t"
        "mov %[b], %%ebx \n\t"
        "add %%eax, %%ebx \n\t"
        "mov %ebx, %[c] \n\t"
        : [c] "=rm" (c)
        : [a] "rm" (a), [b] "rm" (b)
        : "eax", "ebx", "cc"
      );

    Что это всё значит можно почитать тут.

    Компилирую, а тут фигня происходит:

    Ошибка говорит о том, что код попытался обратиться к глобальному символу a, но такого символа нет. Потому что переменная a размещена на стеке и символьного имени у неё и правда нет. Если бы она (вместе с b и c) была глобальной, всё равно была бы ошибка (по крайней мере при компиляции под 64 бита), но другая.
    Ответ написан
    3 комментария
  • Установка новых компиляторов на CentOS6?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Построить нужный компилятор с помощью crosstool-NG?
    Ответ написан
    Комментировать
  • Существует ли таблица совместимости компиляторов и версий библиотек?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Для gcc и его libstdc++ есть таблица соответствия версии компилятора и версии символов из его библиотеки, а так же описание правил, по которым версии изменяются и вообще всей идеи версионирования ABI: https://gcc.gnu.org/onlinedocs/libstdc++/manual/ab...
    Ответ написан
    Комментировать
  • Почему ассемблерный код (GNU assembler) компилируется на одной машине, но не компилируется на другой?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    $ gcc -fPIC -o a.out ./1_1.s
    Параметр -fPIC не помогает

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

    movl $.hello_str, %edi

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

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    перекомпилируйте с параметром -fPIC
    gcc -fPIC ./hello.s

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

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

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

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Фактически, по адресу 0x0060 лежит какой-то мусор, который никак не относится к тому, что я туда хотел положить.

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

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

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    --build - платформа где будут собираться исходники какой либо программы
    --host - указываем где будет запускаться скомпиленная программа
    --target - а это как я понимаю используется чтобы указать где будет собираться сам GCC?

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

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

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

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

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

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    .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
    http://dilbert.com/strip/1998-08-24
    Хотя большинство этих пакетов установлено, они почему-то не определяются.

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