Привет!
Такой вопрос: есть такая вещь как __attribute__ ((constructor)). Предположим я использую его в инициализации библиотеки. Потом использую его в приложении, которое использует эту библиотеку. Я правильно понимаю, что библиотечный ((constructor)) будет вызван раньше приложенческого? Отвечаю на вопрос, зачем мне это нужно - мне надо вызвать функцию библиотеки в инициализаторе приложения, а эта функция работать без инициализатора библиотеки не будет.
Нужен официальный пруф.
Вопрос номер два. А будет это работать в более сложной цепочке? A.so (init A) <- B.so (init B, related on A) <- C.elf (init C, related on B)
Minimal Code Example:
mkdir -p /tmp/libtest && echo -e "#include <stdio.h>\n\nint target = 10;\n\nstatic void target_init(void) __attribute__ ((constructor));\n\nstatic void target_init(void)\n{\n target = 50;\n}\n\nint target_return(void)\n{\n\n return target;\n}\n" > /tmp/libtest/lib.c && echo -e "#include <stdio.h>\n\nextern int target_return(void);\n\nstatic void main_init(void) __attribute__ ((constructor));\n\nstatic void main_init(void)\n{\n printf(\"main_init: %d\\\\n\", target_return())\n}\n\nint main(void)\n{\n printf(\"main: %d\\\\n\", target_return());\n return 0;\n}\n" > /tmp/libtest/main.c && gcc -fPIC -shared /tmp/libtest/lib.c -o /tmp/libtest/liblib.so && gcc main.c -o /tmp/libtest/main.elf -L. -llib && LD_LIBRARY_PATH=/tmp/libtest/ /tmp/libtest/main.elf