¿Cómo incluir todos los objetos de un archivo en un objeto compartido?

Al comstackr nuestro proyecto, creamos varios archivos (bibliotecas estáticas), por ejemplo, liby.a y libz.a que contienen un archivo de objeto que define una función y_function() y z_function() . Luego, estos archivos se unen en un objeto compartido, digamos libyz.so , que es uno de nuestros principales libyz.so distribuibles.

 g++ -fPIC -c -o yo y.cpp ar cr liby.a yo g++ -fPIC -c -o zo z.cpp ar cr libz.a zo g++ -shared -L. -ly -lz -o libyz.so 

Al usar este objeto compartido en el progtwig de ejemplo, digamos xc , el enlace falla debido a una referencia indefinida a las funciones y_function() y z_function() .

 g++ xo -L. -lyz -o xyz 

Sin embargo, funciona cuando enlace el ejecutable final directamente con los archivos (bibliotecas estáticas).

 g++ xo -L. -ly -lz -o xyz 

Supongo que los archivos objeto contenidos en los archivos no están vinculados a la biblioteca compartida porque no se usan en ella. ¿Cómo forzar la inclusión?

Editar:

La inclusión se puede forzar utilizando la opción ld archivo completo. Pero si da como resultado errores de comstackción:

 g++ -shared '-Wl,--whole-archive' -L. -ly -lz -o libyz.so /usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init': (.text+0x1d): undefined reference to `__init_array_end' /usr/bin/ld: /usr/lib/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object /usr/bin/ld: final link failed: Bad value 

Alguna idea de donde viene esto?

Podrías probar (ld (2)):

  --whole-archive For each archive mentioned on the command line after the --whole-archive option, include every object file in the archive in the link, rather than searching the archive for the required object files. This is normally used to turn an archive file into a shared library, forcing every object to be included in the resulting shared library. This option may be used more than once. 

(gcc -Wl, – archivo completo)

Además, debe poner -Wl,--no-whole-archive al final de la lista de la biblioteca. (como dijo Dmitry Yudakov en el comentario a continuación)