c++ linker ld abstract-factory static-block

c++ - Al vincular, ¿hay algo entre "agarrar lo que necesita" y "agarrar todo"(-Wl,-todo-archivo)?



linker ld (1)

Puede obligar al vinculador a mantener una función dada (y, naturalmente, a todo el código que se llama desde esta función). Agregue -u my_function al comando de enlace. Muchos sistemas de compilación permiten que las bibliotecas estáticas ''exporten'' la configuración de compilación a quienes las usan. Por ejemplo, para Android ndk-build framework, puede especificar algo como

include $(CLEAR_VARS) LOCAL_MODULE := the_best_static_library LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_EXPORT_LDFLAGS := -u my_function include $(PREBUILT_STATIC_LIBRARY)

en tu módulo Android.mk . La gente lo reutiliza agregando a su Android.mk la declaración simple

$(call import-module,third_party/the_best_static_library)

NB Para que este enfoque funcione, my_function() no se puede declarar static . Si algún símbolo se declara como estático en el alcance del archivo, entonces el vinculador no lo sabrá por su nombre. Afortunadamente, si se hace referencia en algún código que el enlazador decide conservar, tampoco se eliminará. Además, a menos que haga un esfuerzo especial , el enlazador quitará o mantendrá unidades de compilación completas (también conocidas como archivos C). Por lo tanto, generalmente es suficiente para "anclar" una función ficticia para mantener muchas funciones y datos.

Tengo esta biblioteca que implica algún código de inicialización estático que debe ejecutarse antes de main() . Todo funciona bien si solo compila todas las unidades de traducción juntas, pero no funciona si proporciono una biblioteca estática ( .a archivo .a ) y los usuarios vinculan su aplicación con ella: el vinculador simplemente ignora los símbolos que hacen que mi traducción inicialización estática

Alternativa, y puedo hacer que el enlazador recoja todo en la biblioteca estática, si especifico la -Wl,--whole-archive en GCC, es decir, especifico la opción --whole-archive al enlace GNU.

Pero, ¿hay algún término medio? ¿Puedo marcar algunos símbolos y hacer que el vinculador siempre los recoja para el ejecutable, mientras que el resto de los símbolos se agregan solo cuando es necesario?

Motivación: utilizo algunos bloques estáticos para registrar clases en una fábrica; Quiero que mi código esté disponible como una biblioteca (no dinámica), sin que el código de usuario tenga que realizar ningún "hechizo mágico" para que se llene la fábrica.

Algunas preguntas relacionadas: