Note que a página wiki diz que sua saída pode ser diferente. Você pode seguir a discussão sobre esse assunto exemplo que levou a que o aviso fosse adicionado à página do Wiki no LinuxQuestions.
Em geral, essas diferenças são baseadas em como coisas como libc
(e talvez gdb
) são compiladas em sistemas diferentes. Note que o exemplo é executado no Fedora, não no Ubuntu; Portanto, o sistema básico pode ter algumas diferenças importantes em sua configuração.
Acho que esse é o principal motivo da diferença. De fato, eu corri o exemplo no Fedora e recebi uma saída que era mais ou menos idêntica à saída do exemplo.
O ponto principal é que a saída que você está recebendo é a saída normal para o Ubuntu. Eu tenho a mesma saída. Você pode emitir o comando bt
a partir desse ponto e o próximo conjunto de saída será muito semelhante à saída no exemplo.
Então, por que o gdb está procurando por arquivos de montagem quando você está trabalhando em C? Bem, lembre-se de que é libc
que está procurando o arquivo de montagem. O GDB está apenas relatando o que aconteceu.
E libc
está procurando o arquivo de montagem essencialmente porque ele deve: partes da biblioteca são implementadas na montagem.
Eu não sou um guru no funcionamento interno da biblioteca ou conjunto padrão C, portanto, quero ter cuidado para não dizer algo incorreto.
Mas observe duas coisas sobre este exemplo:
-
É sobre comprimento, que por definição entrará em definições dependentes do sistema.
Se você olhar a mensagem, verá que, de fato, a biblioteca está lendo seu próprio diretório interno
sysdeps
, onde os diretórios dependentes do sistema são armazenados. Este diretório faz parte da biblioteca compilada e não faz parte do sistema de arquivos visível no computador.De acordo com a documentação da Biblioteca GNU C , essa estrutura é criada com base no resultado do utilitário
configure
, que determina como a biblioteca é compilada.Se você olhar para o código-fonte da libc, verá que
strlen
chama funções internas ocultas com base na arquitetura do sistema, que por sua vez chama outro assembly oculto interno e dependente do sistemastrlen.S
(eu conto 18 arquivos com esse nome, todos para archives diferentes), que por sua vez chama (ou pode chamar?) na função.S
para diferentes processadores. Ossse
epminub
estão relacionados aos detalhes do processador. -
E por que não está encontrando o arquivo? Eu imagino que não encontre porque não está lá. O binário compilado não o inclui (presumo) porque não é necessário neste sistema e
configure
não disse que deveria ser criado durante a compilação.O ponto aqui é que o exemplo está passando um
NULL
para uma função que espera uma string, o que é um grande erro. Ao contrário das linguagens de nível superior, o compilador não detecta isso. O resultado é um comportamento indefinido, então tudo pode acontecer.Meu palpite é que a biblioteca está tentando encontrar a versão da função que acha que faz mais sentido; mas como o
NULL
não tem sentido aqui, ele adivinha errado e procura uma versão que não está lá.De qualquer forma, ele falhará com um dump principal. Eu também acho que a biblioteca compilada para o Fedora não exibe exatamente o mesmo comportamento por causa de várias diferenças no sistema e porque qualquer comportamento é legal neste momento.