Ответы пользователя по тегу GCC
  • Что делать с кросс-компиляцией на gcc?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    apt-get install gcc-aarch64-linux-gnu

    после этой команды команда dpkg -L gcc-aarch64-linux-gnu покажет тебе содержимое пакета, откуда ты узнаешь, что имя компилятора -- aarch64-linux-gnu-gcc
    Ответ написан
    1 комментарий
  • Почему не собирается EFI application?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    пишет, что не может найти "efi.h", хотя он есть в папке inc из Makefile

    что такое "папка inc из Makefile"? Если ты имеешь в виду переменную inc определённую в 7й строке, то ты её нигде не использовал, а сами по себе переменные с произвольными именами в Makefile ничего не значат.

    gcc -fshort-wchar -I -I/ -I/usr/include -O2 -Wall -fpic -DEFI_FUNCTION_WRAPPER -ffreestanding -nostdlib -c main.c -o main.o
    main.c:1:10: фатальная ошибка: efi.h: Нет такого файла или каталога

    смотри: нигде в списке -I ты не указал своего каталога inc, как по-твоему компилятор должен понять, что efi.h нужно там искать?

    -I$(EFIINC)

    В твоём Makefile не определена переменная EFIINC, откуда ты ожидаешь что она возьмётся?

    Судя по содержимому Makefile стоит заменить имя inc на EFIINC, lib на EFILIB, crtobj на CRTOBJ и т. д.
    Ответ написан
  • В чем проблема не нахождения ссылок на функции*?

    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 комментария