Требуется чтоб во время или после сборки начальное значение определённой переменной было равно размеру бинарника на момент окончания сборки.
Нужно это для того, чтоб потом можно было дописать в конец бинарника некоторые данные, а потом во время исполнения читать их по смещению равному значению этой переменной.
Я сделал это так:
1. Собираю временный бинарник с переменной exe_size=1.
2. Его размер записываю в exe_size.
3. Собираю искомый бинарник с новым значением exe_size.
Выглядит это так:
main.c
#include <stdlib.h>
#include <stdio.h>
extern size_t exe_size;
int main(int argc, char *argv[argc+1]) {
printf("this file size is %zu\n", exe_size);
return EXIT_SUCCESS;
}
Makefile
default: tmp main
tmp:
@mkdir tmp
main: tmp/main.o tmp/exe_size_fill_.o
gcc $^ -o $@
@if [ `stat -c %s $@` -ne `stat -c %s tmp/main` ]; then\
echo 'error: wrong exe_size'; rm $@; exit 1; fi
tmp/main.o: main.c
gcc $< -c -o $@
tmp/exe_size_fill_.o: tmp/exe_size_fill_.c
gcc $< -c -o $@
tmp/exe_size_fill_.c: tmp/main
echo '#include <stdlib.h>' > $@
echo "size_t exe_size = `stat -c %s $<`;" >> $@
tmp/main: tmp/main.o tmp/exe_size_blank.o
gcc $^ -o $@
tmp/exe_size_blank.o: tmp/exe_size_blank.c
gcc $< -c -o $@
tmp/exe_size_blank.c:
echo '#include <stdlib.h>' > $@
echo 'size_t exe_size = 1;' >> $@
clean:
rm -rf main tmp
Запускаем make
, затем ./main
.
Программа выдаёт что-то типа: this file size is 7399
.
Вроде задача решена, но меня терзают смутные сомнения: может я изобрёл велосипед или пытаюсь удалить гланды через одно место?
Хочу узнать на этот счёт мнения лоровских экспертов.
Существуют ли для поставленной задачи более менее стандартные способы?