Como incluir todos os objetos de um arquivo morto em um objeto compartilhado?

Ao compilar nosso projeto, criamos vários arquivos (bibliotecas estáticas), digamosliby.a elibz.a cada um contém um arquivo de objeto que define uma funçãoy_function() ez_function(). Em seguida, esses arquivos são unidos em um objeto compartilhado, digamoslibyz.so, esse é um dos nossos principais destinos distribuíveis.

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

Ao usar esse objeto compartilhado no programa de exemplo, digax.c, o link falhará devido a referências indefinidas a funçõesy_function() ez_function().

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

No entanto, funciona quando eu vinculo o executável final diretamente aos arquivos (bibliotecas estáticas).

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

Meu palpite é que os arquivos de objetos contidos nos arquivos não sãoligado na biblioteca compartilhada porque eles não são usados nela. Como forçar a inclusão?

Editar:

A inclusão pode ser forçada usando --whole-archiveld opção. Mas se resultar em erros de compilação:

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

Alguma idéia de onde isso vem?

questionAnswers(1)

yourAnswerToTheQuestion