MBR (mbr) wrote,
MBR
mbr

gcc

У gcc своя, особая магия. Я думал, что познал ее всю, когда генерировал линкерные скрипты, подсовывая их компилятору, как ассемблерный код, но не давая пройти дальше препроцессора. Мой личный хак? Ничего подобного - это дефолтный способ сборки ядра линукса, там и подсмотрел.

Мир, как говорится, полон чудес.

#define DEFINE(sym, val) asm volatile("\n-> " #sym " %0 " #val "\n" : : "i" (val))
#define OFFSETOF(s, m) \
    DEFINE(offsetof_##s##_##m, offsetof(s, m));

#define SIZEOF(s) \
    DEFINE(sizeof_##s, sizeof(s));

void foo()
{
    OFFSETOF(KERNEL, error);
    OFFSETOF(KERNEL, pool);
    SIZEOF(KERNEL);
}


Я, честно говоря, не понимаю, зачем для генерации препроцессора посредством препроцессора понадобился инлайновый ассемблер... Но это еще полбеды, потом мы собираем _отладочный_ выхлоп всего этого, натравливаем awk и получаем... хедер.

$(GCC) $(FLAGS_CC) -S $< -o - | awk '($$1 == "->") { print "#define " $$2 " " $$3 }' > $(BUILD_DIR)/$@

Выхлоп:

#define offsetof_KERNEL_error #16
#define offsetof_KERNEL_pool #4
#define sizeof_KERNEL #120
Tags: embed, it, linux
Subscribe

  • Самодельный антисептик

    Небольшой отчет по самостоятельному изготовлению антисептика. По компонентам понадобятся: - бихромат натрия - медный купорос - стабилизатор осадка.…

  • Победил битрикс

    Раньше рассказывал, как мы пытаемся битрикс внедрить. Сначала просто дал задачу вебщику подергать странички и собрать отчет по линкам. Ад. Там…

  • Советский инженер - это звучит гордо

    Порадовался с последнего стеба vladimir_akinin над программистами. Однако в комменты выползло какое-то количество старых пердунов,…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 6 comments