Como depurar o processo de vinculação - GCC / ld - STL C ++

9

Estou trabalhando em um córtex nu-metal M3 em C ++ para diversão e lucro.

Ultimamente, decidi tentar usar a biblioteca STL, pois precisava de alguns contêineres. Eu pensei que simplesmente fornecendo meu alocador não iria adicionar muito código para o binário final, desde que você obtenha apenas o que você usa. Na verdade, eu nem esperava nenhum processo de vinculação com o STL (dando meu alocador), como eu pensava que era todo código de template.

Eu estou compilando com -fno-exception pelo caminho.

Infelizmente, cerca de 600 KB ou mais são adicionados ao meu binário. Eu olhei para cima que símbolos são incluído no binário final com nm e parecia uma piada para mim. A lista é tão longa Eu não vou tentar passar por isso. Embora existam alguns símbolos fracos.

Eu também procurei no arquivo .map gerado pelo linker e até encontrei os símbolos scanf

.text          0x000158bc       0x30   /CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../arm-none-linux-gnueabi/libc/usr/lib/libc.a(sscanf.o)¶
            0x000158bc                __sscanf¶
            0x000158bc                sscanf¶
            0x000158bc                _IO_sscanf¶


$ arm-none-linux-gnueabi-nm binary | grep scanf
000158bc T _IO_sscanf
0003e5f4 T _IO_vfscanf
0003e5f4 T _IO_vfscanf_internal
000164a8 T _IO_vsscanf
00046814 T ___vfscanf
000158bc T __sscanf
00046814 T __vfscanf
000164a8 W __vsscanf
000158bc T sscanf
00046814 W vfscanf
000164a8 W vsscanf

Como posso depurar isso? Primeiro, queria entender o que exatamente o GCC está usando para vincular (estou vinculando por meio do GCC). Eu sei que se o símbolo é encontrado em um segmento de texto, o segmento inteiro é usado, mas ainda assim é demais.

Qualquer sugestão sobre como lidar com isso seria realmente apreciada.

Obrigado S.

    
por emitrax 21.07.2012 в 14:43
fonte

2 respostas

3

Usando as opções -v e -Wl,-v do GCC, mostraremos os comandos do vinculador (e as informações de versão do vinculador) que estão sendo usados.

Qual versão do GCC você está usando? Fiz algumas alterações para o GCC 4.6 (consulte PR 44647 e PR 43863 ) para reduzir o tamanho do código para ajudar os sistemas incorporados. Ainda há uma solicitação de aprimoramento excelente ( PR 43852 ) para permitir a desativação da inclusão dos símbolos de E / S que você Está vendo - alguns deles vêm do manipulador terminate detalhado, que imprime uma mensagem quando o processo é finalizado com uma exceção ativa. Se você não está usando execções, então algum desse código é inútil para você.

    
por Jonathan Wakely 21.07.2012 / 20:06
fonte
2

O problema não é sobre o STL, é sobre a biblioteca padrão.

O próprio STL é puro (de certa forma), mas a Biblioteca Padrão também inclui todos esses pacotes de fluxos e parece que você também conseguiu extrair o libc também ...

O problema é que a Biblioteca Padrão nunca foi escolhida para ser escolhida, então pode não ter havido muita preocupação em reutilizar coisas da Biblioteca Padrão C ...

Você deve primeiro tentar identificar quais arquivos são recebidos quando você compila (usando strace por exemplo ), desta forma você pode verificar que você só usa arquivos em somente cabeçalho .

Depois, você pode tentar remover o link que ocorre. Existem opções para passar para o gcc de forma precisa que você gostaria de uma compilação padrão livre de biblioteca, algo como --nostdlib por exemplo, no entanto eu não sou bem versado o suficiente naqueles para instruí-lo exatamente aqui.

    
por Matthieu M. 21.07.2012 / 19:11
fonte