Ответы пользователя по тегу GCC
  • Скомпилированный в GCC exe файл вылетает досрочно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Но в режиме отладки всё, как я уже писал выше, работает.

    Да не, это только видимость. Смотри:

    $ gcc -std=c99 -O2 -g3 -fsanitize=address main.c acp.c md5.c -o main
    $ ./main
    Base64('Hello') = "SGVsbG8="
    MD5('Hello') = "8b1a9953c4611296a827abf8c47804d7"
    =================================================================
    ==1045705==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x604000000071 at pc 0x7fb0d46486f8 bp 0x7ffd0affb580 sp 0x7ffd0affad30
    WRITE of size 33 at 0x604000000071 thread T0
        #0 0x7fb0d46486f7 in __interceptor_strcat ../../../../src/libsanitizer/asan/asan_interceptors.cpp:377
        #1 0x564b2388c0de in prepareKeys /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:263
        #2 0x564b2388cac4 in acraw /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:319
        #3 0x564b2388d8c2 in acraws /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:401
        #4 0x564b2388d8c2 in acraws_basic /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:409
        #5 0x564b2388a62e in testSimpleEncryption /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main.c:20
        #6 0x564b2388a368 in main /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main.c:111
        #7 0x7fb0d44461c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
        #8 0x7fb0d4446284 in __libc_start_main_impl ../csu/libc-start.c:360
        #9 0x564b2388a440 in _start (/home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main+0x3440)
    
    0x604000000071 is located 0 bytes to the right of 33-byte region [0x604000000050,0x604000000071)
    allocated by thread T0 here:
        #0 0x7fb0d46b89cf in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
        #1 0x564b2388fee7 in md5StringHash /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/md5.c:227
    Ответ написан
  • Пытаюсь собрать прошивку для stm32. Ошибка "src/core_cm3.c: Assembler messages"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    g++  ...   src/core_cm3.c src/system_stm32f10x.c -o build/main


    src/core_cm3.c: Assembler messages:
    src/core_cm3.c:447: Error: no such instruction: `mrs %eax,psp'


    На какой системе ты выполняешь сборку, на x86? Тогда чтобы получить код для arm тебе нужен не g++, а какой-нибудь arm-linux-gnueabi-g++.
    Ответ написан
    2 комментария
  • Какой бекэнд выбрать для компилятора?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Думали сделать фронтенд для gcc

    Можно прицепиться к libgccjit.

    хочется как-то этот проектик доделать и разместить на просторах интернета…
    Думали сделать фронтенд для gcc, но этот самый gcc опубликован под GPLv3, т.е. придется нам раскрыть исходный код IDE и самого языка, чего делать не хочется.

    Исходный код требуется раскрывать только обладателям бинарников. Если размещение на просторах интернета -- это онлайн IDE, то бинарника ни у кого нет, следовательно код раскрывать не нужно.

    Однако, предоставление исходников, особенно под свободной лицензией обычно выгодно самим проектам, которые это делают.
    Ответ написан
    Комментировать
  • Что за странная константа?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Зачем он для такой строчки на 69, 70ой строчке добавляет к j такую странную константу.

    В конечном коде выглядит действительно загадочно. Если вызывать компилятор с ключом -fdump-tree-all (фиг знает, как сделать это на godbolt.org, я проверял локально), то уже в самом первом дампе можно увидеть, что if (arr[j - 1] > arr[j]) превращается в это:
    if (*(arr + ((sizetype) j + 1073741823) * 4) > *(arr + (sizetype) ((unsigned int) j * 4)))

    1073741823 -- это 0x3fffffff, 30 единичных бит, т.е. 30-битная -1. Дальше j + 1073741823 превратилось в
    add     r3, r3, #1073741824
    subs    r3, r3, #1

    т.е. в j + 1073741824 - 1. После умножения на 4 старшие два бита j теряются, но в чём смысл использования 30-битной -1 вместо 32-битной -- мне непонятно.
    Поскольку константа появляется ещё до начала архитектурно-зависимых преобразований, она фигурирует в выводе для всех 32-битных архитектур поддерживаемых gcc. Интересно, что это началось между gcc-4.6 и gcc-5, до этого в этом месте генерировался просто sub r3, r3, #1. Ещё интересно, что даже с -O2 эта константа остаётся в сгенерированном коде, а исчезает только с -Os. Выглядит как регрессия.
    Ответ написан
    Комментировать
  • Что делать с кросс-компиляцией на gcc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    apt-get install gcc-aarch64-linux-gnu

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    пишет, что не может найти "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
    "I'm here to consult you" © Dogbert
    При сборке проекта, возникает ошибка ненахождения метода.

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Та же проблемаа, нету функции 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
    "I'm here to consult you" © Dogbert
    на сегодня уже хватит программирования?

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как вызвать из C++ программы функции на ассемблере?

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

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    -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
    "I'm here to consult you" © Dogbert
    а вот остальные не могу

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как запретить VSC отлаживать такие вещи?

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нужно его переделать для GCC.

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

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

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Смысл его прост: отменить действие макроса в определенной части кода, а по ее истечении восстановить этот макрос.

    Таким образом этого сделать нельзя. Потому что в месте где написано #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
    "I'm here to consult you" © Dogbert
    Логичнее было бы воспользоваться опцией -mstackrealign чтобы выравнивать стек на входе в функцию.
    Ответ написан
    2 комментария
  • Как в gcc сохранять объектные файлы(в другой папке)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как в 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
    "I'm here to consult you" © Dogbert
    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
    "I'm here to consult you" © Dogbert
    Построить нужный компилятор с помощью crosstool-NG?
    Ответ написан
    Комментировать
  • Существует ли таблица совместимости компиляторов и версий библиотек?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Для gcc и его libstdc++ есть таблица соответствия версии компилятора и версии символов из его библиотеки, а так же описание правил, по которым версии изменяются и вообще всей идеи версионирования ABI: https://gcc.gnu.org/onlinedocs/libstdc++/manual/ab...
    Ответ написан
    Комментировать