Но в режиме отладки всё, как я уже писал выше, работает.
$ 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
Думали сделать фронтенд для gcc
хочется как-то этот проектик доделать и разместить на просторах интернета…
Думали сделать фронтенд для gcc, но этот самый gcc опубликован под GPLv3, т.е. придется нам раскрыть исходный код IDE и самого языка, чего делать не хочется.
Зачем он для такой строчки на 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)))
j + 1073741823
превратилось в add r3, r3, #1073741824
subs r3, r3, #1
j + 1073741824 - 1
. После умножения на 4 старшие два бита j теряются, но в чём смысл использования 30-битной -1 вместо 32-битной -- мне непонятно.sub r3, r3, #1
. Ещё интересно, что даже с -O2
эта константа остаётся в сгенерированном коде, а исчезает только с -Os
. Выглядит как регрессия. пишет, что не может найти "efi.h", хотя он есть в папке 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)
EFIINC
, откуда ты ожидаешь что она возьмётся?inc
на EFIINC
, lib
на EFILIB
, crtobj
на CRTOBJ
и т. д. Та же проблемаа, нету функции 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
-L путь должен быть полным путем в моей хост машине где производится кросс компиляция или путь относительно пути указанного в параметре sysroot?
=
либо строки $SYSROOT
($SYSROOT не должен быть интерпретирован оболочкой и должен попасть в таком виде в аргументы компилятора), он интерпретируется относительно sysroot.Как запретить VSC отлаживать такие вещи?
Нужно его переделать для GCC.
Возможно реакции требует только 1 строчка после ифа.
__attribute__((section("имя секции")))
. См. Смысл его прост: отменить действие макроса в определенной части кода, а по ее истечении восстановить этот макрос.
#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
Как в gcc сохранять объектные файлы
-o
-- путь к результату, препроцессирования/компиляции/линковки. Научи свой Makefile подставлять правильный путь в эту опцию.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
asm ( "mov a, %eax \n\t" "mov b, %ebx \n\t" "add %eax, %ebx \n\t" "mov %ebx, c \n\t" );
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 бита), но другая.