Estou tentando desmontar um objeto construído para ARM com gcc. Infelizmente, objdump está tentando adivinhar se o código é ARM e Thumb, e está ficando errado: ele acha que meu código é polegar quando o seu realmente ARM. Eu vejo que objdump tem uma opção para forçá-lo a interpretar todas as instruções como Thumb (-Mforce-thumb), mas ele não tem um para forçar o modo ARM Isso parece uma omissão muito estranho para mim, e sua seriamente prejudicando a minha capacidade de obter Trabalho feito (Im em um dispositivo embutido e meu único meio de depuração é olhar para a desmontagem). Ive tentou várias abordagens, incluindo a tentativa de dizer objdump para usar uma arquitetura ARM que não suporta Polegar, mas nada parece funcionar. Qualquer idéia (E sim, eu sei que as instruções são realmente ARM.) Perguntou Aug 25 11 at 16:43 Isso soa como um bug em compilador ou objdump. Normalmente, os símbolos devem ser marcados corretamente se eles são polegar ou braço e desmontado em conformidade. Dito isto, há algumas coisas que você pode tentar: interpretar o arquivo como binário simples (-b binário - D) - isso desabilitará a verificação de símbolos e desmontará todo o arquivo como ARM. Inconveniente de: muito de lixo na saída, não Nice endereços. Use o IDA Pro. Mesmo se adivinhar incorretamente, você sempre pode substituir sua decisão. Além disso, é um ambiente de desmontagem muito mais agradável :) Eu preciso da informação de símbolo, então eu sei o que eu estou olhando, então usando raw binário não cortá-lo, I39m medo. O arquivo em questão tem informações de depuração para que as informações de marcação devem estar lá. Meu processo de construção é complicado, mas envolve gcc em todas as idéias o que poderia estar eliminando o símbolo marcando ndash David Dado August 26 11 at 10:42 É difícil dizer o que é exatamente o problema. Imprima o conteúdo da tabela de símbolos e dê uma olhada em printinsn (braço) em arm-dis. c. Talvez isso lhe dê algumas idéias. Ndash Igor Skochinsky Agosto 26 11 at 13: 30Linux Objdump Comando Exemplos (Desmonte um arquivo binário) O comando Objdump no Linux é usado para fornecer informações completas sobre arquivos de objeto. Este comando é usado principalmente pelos programadores que trabalham em compiladores, mas ainda é uma ferramenta muito útil para programadores normais também quando se trata de depuração. Neste artigo, vamos entender como usar o comando objdump através de alguns exemplos. A sintaxe básica do objdump é: Existe um vasto leque de opções disponíveis para este comando. Vamos tentar cobrir uma boa quantidade deles neste tutorial. O arquivo binário ELF do seguinte programa C é usado em todos os exemplos mencionados neste artigo. Nota: O acima é apenas um código de teste que estava sendo usado para algum outro propósito, mas eu achei simples o suficiente para usar para este artigo. 1. Exibir o conteúdo do cabeçalho do arquivo global usando a opção - f Considere o seguinte exemplo: Então vemos que as informações relacionadas ao cabeçalho do arquivo geral foram mostradas na saída. NOTA: O formato executável utilizado nos exemplos é ELF. Para saber mais sobre isso, consulte o nosso artigo sobre o formato de arquivo ELF. Conteúdo de cabeçalho de arquivo específico de formato de objeto 2.Display usando a opção - p O exemplo a seguir imprime as informações específicas de formato de arquivo de objeto. 3. Exibir o conteúdo dos cabeçalhos de seção usando a opção - h Pode haver várias seções em um arquivo de objeto. As informações relacionadas a eles podem ser impressas usando a opção - h. Os exemplos a seguir mostram várias seções. Como você vê, há um total de 26 (somente a saída parcial é mostrada aqui). Então, vemos que as informações relacionadas a todos os cabeçalhos de seção foram impressas na saída. Na saída acima, Size é o tamanho da seção carregada, VMA representa o endereço de memória virtual, LMA representa o endereço de memória lógico, File off é este section8217s deslocado a partir do início do arquivo, Algn representa alinhamento, CONTENTS, ALLOC, LOAD , READONLY, DATA são sinalizadores que representam que uma seção específica deve ser LOADED ou READONLY etc. 4. Exibir o conteúdo de todos os cabeçalhos usando a opção - x As informações relacionadas a todos os cabeçalhos no arquivo de objeto podem ser recuperadas usando - x opção. O exemplo a seguir exibe todas as seções (somente a saída parcial é mostrada aqui): 5. Exibir o conteúdo do assembly de seções executáveis usando a opção - d Considere o seguinte exemplo. O conteúdo do assembler das seções executáveis (no arquivo do objeto) é exibido nesta saída (saída parcial mostrada abaixo): 6. Exibir o conteúdo do conjunto de todas as seções usando a opção - D Caso o conteúdo do conjunto de todas as seções seja necessário na saída, A opção - D pode ser usada. Considere o seguinte resultado: Então vemos que a saída relevante foi exibida. Como a saída era muito longa, então eu a cortei. Observe que eu usei o comando pager para controlar a saída. 7. Exibir o conteúdo completo de todas as seções usando a opção - s Considere o seguinte exemplo: Assim, vemos que o conteúdo completo de todas as seções foi exibido na saída. 8. Exibir informações de depuração usando a opção - g Considere o seguinte exemplo: Assim, vemos que todas as informações de depuração disponíveis foram impressas na saída. 9. Exibir o conteúdo da tabela de símbolos (ou tabelas) usando a opção - t Considere o seguinte exemplo: Assim, vemos que o conteúdo da tabela de símbolos foi exibido na saída. 10. Exibir o conteúdo da tabela de símbolos dinâmicos usando a opção - T Os símbolos dinâmicos são aqueles que são resolvidos durante o tempo de execução. As informações relacionadas a esses símbolos podem ser recuperadas usando a opção - D. Considere o seguinte exemplo: Assim, vemos que as informações relacionadas aos símbolos dinâmicos foram exibidas na saída. 11. Exibir as entradas de realocação dinâmica no arquivo usando a opção - R Considere o seguinte exemplo: Assim, vemos que todas as entradas de realocação dinâmica foram exibidas na saída. 12. Exibir a seção de interesse usando a opção - j Isso é extremamente útil quando você conhece a seção relacionada à qual a informação é necessária. A opção - j é usada neste caso. Considere o seguinte exemplo: Assim, vemos que as informações relacionadas à seção rodata foi exibida acima. 13. Use o formato de desmontagem mais antigo usando a opção 8211prefix-addresses O formato mais antigo imprime o endereço completo em cada linha. Considere o seguinte exemplo: Assim, vemos que o endereço completo foi impresso na saída. 14. Aceitar opções de entrada de um arquivo usando a opção Se você quiser, as opções para objdump podem ser lidas de um arquivo. Isso pode ser feito usando a opção 82168217. Considere o seguinte exemplo: Neste exemplo acima, eu usei as opções - v e - i. Enquanto - v é usado para imprimir as informações de versão, - i é usado para fornecer formatos de objeto e arquiteturas suportados. Agora eu criei um arquivo e adicione estas duas opções lá. Execute o objdump chamando o arquivo options. txt conforme mostrado abaixo. Isso exibe a mesma saída como acima, como ele está lendo as opções do arquivo options. txt file. objdump (1) - página de manual do Linux Descrição objdump exibe informações sobre um ou mais arquivos de objeto. As opções controlam as informações específicas a serem exibidas. Esta informação é útil principalmente para os programadores que estão trabalhando nas ferramentas de compilação, ao contrário de programadores que apenas querem seu programa para compilar e trabalhar. Objfile. São os arquivos objeto a serem examinados. Quando você especifica arquivos, objdump mostra informações sobre cada um dos arquivos objeto membro. As formas longas e curtas de opções, mostradas aqui como alternativas, são equivalentes. Pelo menos uma opção da lista - a, - d, - D, - e, - f, - g, - G, - h, - H, - p, - r, - R, - s, - S, T, - T, - V, - x deve ser dado. - a --archive-header Se algum dos arquivos objfile forem arquivos, exiba as informações do cabeçalho do arquivo (em um formato semelhante ao ls - l). Além da informação que você poderia alistar com ar tv. Objdump - a mostra o formato do arquivo objeto de cada membro do arquivo. --adjust-vma offset Ao despejar informações, primeiro adicione o deslocamento a todos os endereços de seção. Isso é útil se os endereços de seção não correspondem à tabela de símbolos, o que pode acontecer ao colocar seções em endereços particulares ao usar um formato que não pode representar endereços de seção, como a. out. - b bfdname --target bfdname Especifique se o formato de código de objeto dos arquivos de objeto é bfdname. Esta opção pode não ser necessária objdump pode reconhecer automaticamente muitos formatos. Por exemplo, exibe informações resumidas dos cabeçalhos de seção (-h) de fu. o. Que é explicitamente identificado (-m) como um arquivo de objeto VAX no formato produzido por compiladores Oasys. Você pode listar os formatos disponíveis com a opção - i. - C --demangle style Decode (demangle) nomes de símbolo de nível inferior em nomes de nível de usuário. Além de remover qualquer sublinhado inicial prepended pelo sistema, isso torna os nomes das funções C legíveis. Diferentes compiladores têm diferentes estilos de manipulação. O argumento opcional de estilo de desmembramento pode ser usado para escolher um estilo de demarcação apropriado para o seu compilador. - g --debugging Exibe informações de depuração. Isso tenta analisar STABS e informações de formato de depuração IEEE armazenadas no arquivo e imprimi-lo usando um C como sintaxe. Se nenhum desses formatos for encontrado, esta opção recairá na opção - W para imprimir quaisquer informações DWARF no arquivo. - e --debugging-tags Como - g. Mas a informação é gerada em um formato compatível com a ferramenta ctags. - d --disassemble Exibe os mnemônicos do montador para as instruções da máquina de objfile. Esta opção apenas desmonta as seções que devem conter instruções. - D - desassemble-all Como - d. Mas desmontar o conteúdo de todas as seções, não apenas aqueles esperados para conter instruções. Se o alvo for uma arquitetura ARM esse switch também tem o efeito de forçar o desassemblador a decodificar partes de dados encontradas em seções de código como se fossem instruções. --prefix-addresses Ao desmontar, imprima o endereço completo em cada linha. Este é o formato de desmontagem mais antigo. - EB - EL --endian Especifique o endianness dos arquivos de objeto. Isso afeta somente a desmontagem. Isso pode ser útil ao desmontar um formato de arquivo que não descreve informações de endianness, como S-records. - f --file-headers Exibe informações resumidas do cabeçalho geral de cada um dos arquivos objfile. - F --file-offsets Ao desmontar seções, sempre que um símbolo é exibido, também exibe o deslocamento do arquivo da região de dados que está prestes a ser despejado. Se os zeros estiverem sendo ignorados, então, quando a desmontagem for retomada, informe ao usuário quantos zeros foram ignorados eo deslocamento do arquivo do local de onde a desmontagem é retomada. Ao despejar seções, exiba o deslocamento do arquivo do local de onde o despejo é iniciado. --file-start-context Especifique que, ao exibir a codificação de origem interligada (que assume - S) de um arquivo que ainda não foi exibido, estenda o contexto para o início do arquivo. - h --section-headers --headers Exibe informações de resumo dos cabeçalhos de seção do arquivo de objeto. Os segmentos de arquivo podem ser realocados para endereços não padrão, por exemplo, usando o - Ttext. - Tdata. Ou - Tbss opções para ld. No entanto, alguns formatos de arquivo de objeto, como a. out, não armazenam o endereço inicial dos segmentos de arquivo. Nessas situações, embora ld realoca as seções corretamente, usando objdump - h para listar os cabeçalhos de seção de arquivo não é possível mostrar os endereços corretos. Em vez disso, ele mostra os endereços habituais, que estão implícitos para o destino. - H --help Imprime um resumo das opções para objdump e exit. - i --info Exibe uma lista mostrando todas as arquiteturas e formatos de objeto disponíveis para especificação com - b ou - m. - j name --section name Exibe informações somente para o nome da seção. - l --line-numbers Rótulo no visor (usando informações de depuração) com o nome do arquivo e os números de linha de origem correspondentes ao código objeto ou relocais mostrados. Útil somente com - d. - D. Ou - r. - m machine --architecture Especifica a arquitetura a ser usada ao desmontar arquivos de objeto. Isso pode ser útil ao desmontar arquivos de objeto que não descrevem informações de arquitetura, como registros S. Você pode listar as arquiteturas disponíveis com a opção - i. Se o destino for uma arquitetura ARM, este parâmetro tem um efeito adicional. Restringe a desmontagem apenas às instruções suportadas pela arquitetura especificada pela máquina. Se for necessário usar essa opção porque o arquivo de entrada não contém nenhuma informação de arquitetura, mas também é desejável desmontar todas as instruções use - marm. - M opções --disassembler-opções opções Passar informações específicas do alvo para o desmontador. Apenas suportado em alguns alvos. Se for necessário especificar mais de uma opção de desmontagem, então várias opções - M podem ser usadas ou podem ser colocadas juntas em uma lista separada por vírgulas. Se o alvo for uma arquitetura ARM, este parâmetro pode ser usado para selecionar qual conjunto de nomes de registros é usado durante o desmon - selador. Especificando - M reg-names-std (o padrão) irá selecionar os nomes de registro como usado na documentação do conjunto de instruções do ARM, mas com o registro 13 chamado sp, o registrador 14 chamado lr e o registrador 15 chamado pc. Especificando - M reg-names-apcs irá selecionar o conjunto de nomes usados pelo ARM Procedure Call Standard, enquanto especificando - M reg-names-raw usará apenas r seguido do número de registro. Existem também duas variantes no esquema de nomenclatura de registro APCS habilitado por - M reg-names-atpcs e - M reg-names-special-at que usam as convenções de nomenclatura ARMThumb Procedure Call Standard. (Ou com os nomes normais do registro ou os nomes especiais do registro). Esta opção também pode ser usada para arquiteturas ARM para forçar o desmontador a interpretar todas as instruções como instruções Thumb usando o switch --disassembler-optionsforce-thumb. Isso pode ser útil ao tentar desmontar o código do polegar produzido por outros compiladores. Para o x86, algumas das funções duplicação de opções da opção - m, mas permitem controle de granulação mais fino. Várias seleções do seguinte podem ser especificadas como uma seqüência de caracteres separados por vírgula. X86-64. I386 e i8086 selecionam desmontagem para a arquitetura fornecida. Intel e att selecionam entre modo de sintaxe de intel e modo de sintaxe de ATampT. Intel-mnemonic e att-mnemonic selecionam entre o modo mnemônico de Intel eo modo mnemônico de ATampT. Intel-mnemonic implica intel e att-mnemonic implica att. Addr64. Addr32. Adr16. Data32 e data16 especificam o tamanho de endereço e o tamanho de operando padrão. Essas quatro opções serão substituídas se x86-64. I386 ou i8086 aparecem mais tarde na cadeia de opção. Por último, sufixo. Quando no modo ATampT, instrui o desassemblador para imprimir um sufixo mnemônico mesmo quando o sufixo poderia ser inferida pelos operandos. Para PowerPC, booke controla a desmontagem de instruções BookE. 32 e 64 selecionam PowerPC e PowerPC64 desmontagem, respectivamente. E300 seleciona a desmontagem para a família e300. 440 seleciona a desmontagem para o PowerPC 440. ppcps seleciona a desmontagem para as instruções individuais emparelhadas do PPC750CL. Para MIPS. Esta opção controla a impressão de nomes mnemônicos de instruções e nomes de registros em instruções desmontadas. Várias seleções dos itens a seguir podem ser especificadas como uma seqüência de caracteres separada por vírgula e as opções inválidas são ignoradas: no-aliases Imprime o mnemônico de instrução bruta em vez de algum mnemônico de pseudo instrução. I. e. Print daddu ou ou em vez de mover, sll em vez de nop, etc. gpr-names ABI Imprimir GPR (registro de uso geral) nomes como apropriado para o ABI especificado. Por padrão, os nomes GPR são selecionados de acordo com o ABI do binário sendo desmontado. Fpr-names ABI Imprimir FPR (floating-point register) nomes como apropriado para o ABI especificado. Por padrão, os números FPR são impressos em vez de nomes. Cp0-names ARCH Print CP0 (coprocessador coprocessador de controle do sistema 0) registra nomes conforme apropriado para a CPU ou arquitetura especificada por ARCH. Por padrão, os nomes de registro CP0 são selecionados de acordo com a arquitetura ea CPU do binário sendo desmontada. Hwr-names ARCH Imprimir HWR (registro de hardware, usado pela instrução rdhwr) nomes apropriados para a CPU ou arquitetura especificada por ARCH. Por padrão, os nomes HWR são selecionados de acordo com a arquitetura ea CPU do binário sendo desmontada. Reg-names ABI Imprimir nomes GPR e FPR como apropriado para o ABI selecionado. Reg-names ARCH Imprime nomes de registro específicos da CPU (nomes CP0 e HWR) conforme apropriado para a CPU ou arquitetura selecionada. Para qualquer uma das opções listadas acima, ABI ou ARCH podem ser especificados como numéricos para ter números impressos em vez de nomes, para os tipos de registros selecionados. Você pode listar os valores disponíveis de ABI e ARCH usando a opção --help. Para VAX. Você pode especificar endereços de entrada de função com - M entrada: 0xf00ba. Você pode usar isso várias vezes para desmontar corretamente os arquivos binários VAX que não contêm tabelas de símbolos (como ROM dumps). Nestes casos, a máscara de entrada de função seria de outra forma decodificada como instruções VAX, o que provavelmente levaria o resto da função a ser desmontada erradamente. - p --private-headers Imprime informações específicas do formato de arquivo do objeto. As informações exactas impressas dependem do formato do ficheiro do objecto. Para alguns formatos de arquivo de objeto, nenhuma informação adicional é impressa. - r --reloc Imprime as entradas de realocação do arquivo. Se usado com - d ou - D. As deslocalizações são impressas intercaladas com a desmontagem. - R --dynamic-reloc Imprime as entradas de realocação dinâmica do arquivo. Isso só é significativo para objetos dinâmicos, como certos tipos de bibliotecas compartilhadas. Quanto a - r. Se usado com - d ou - D. As deslocalizações são impressas intercaladas com a desmontagem. - s --full-contents Exibe o conteúdo completo de qualquer seção solicitada. Por padrão, todas as seções não vazias são exibidas. - S - fonte Exibe o código-fonte entremeado com desmontagem, se possível. Implica - d. Prefixo prefix Especifica prefixo para adicionar aos caminhos absolutos quando usado com - S. --prefix-strip level Indica quantos nomes de diretórios iniciais devem ser removidos dos caminhos absolutos hardwired. Não tem efeito sem prefixo prefixo. --show-raw-insn Ao desmontar instruções, imprima a instrução em hexadecimal, bem como em forma simbólica. Este é o padrão, exceto quando - prefixo-endereços é usado. --no-show-raw-insn Ao desmontar instruções, não imprima os bytes de instrução. Este é o padrão quando --prefix-addresses é usado. --insn-largura largura Exibir bytes de largura em uma única linha ao desmontar instruções. - WlLiaprmfFsoR --dwarfrawline, decodedline, info, abbrev, pubnames, aranges, macro, quadros, frames-interp, str, loc, Ranges Exibe o conteúdo das seções de depuração no arquivo, se houver algum. Se uma das letras ou palavras opcionais segue o interruptor, então apenas os dados encontrados nessas seções específicas serão despejados. - G - stabs Exibe o conteúdo completo de qualquer seção solicitada. Exibir o conteúdo das seções. stab e. stab. index e. stab. excl de um arquivo ELF. Isso só é útil em sistemas (como o Solaris 2.0) no qual as entradas de tabela de símbolos de depuração do. stab são transportadas em uma seção ELF. Na maioria dos outros formatos de arquivo, as entradas da tabela de símbolos de depuração são intercaladas com símbolos de vinculação e são visíveis na saída --syms. --start-address address Inicia a exibição de dados no endereço especificado. Isso afeta a saída do - d. - r e - s opções. --stop-address address Parar de exibir dados no endereço especificado. Isso afeta a saída do - d. - r e - s opções. - t --syms Imprime as entradas da tabela de símbolos do arquivo. Isso é semelhante às informações fornecidas pelo programa nm, embora o formato de exibição é diferente. O formato da saída depende do formato do arquivo que está sendo despejado, mas há dois tipos principais. A aparência é a seguinte: onde o número dentro dos colchetes é o número da entrada na tabela de símbolos, o número sec é o número da seção, o valor fl são os bits de sinalização de símbolos, o número ty é o tipo de símbolos, o scl Número é a classe de armazenamento de símbolos eo valor nx é o número de entradas auxiliares associadas ao símbolo. Os dois últimos campos são o valor dos símbolos e seu nome. O outro formato de saída comum, geralmente visto com arquivos baseados em ELF, tem a seguinte aparência: Aqui o primeiro número é o valor dos símbolos (às vezes referido como seu endereço). O próximo campo é na verdade um conjunto de caracteres e espaços indicando os bits de sinalizador que são definidos no símbolo. Esses caracteres são descritos abaixo. A seguir está a seção com a qual o símbolo está associado ou ABS se a seção é absoluta (ou seja, não conectado a qualquer seção), ou UND se a seção é referenciada no arquivo sendo despejado, mas não definido lá. Depois que o nome da seção vem outro campo, um número, que para símbolos comuns é o alinhamento e para outro símbolo é o tamanho. Finalmente, o nome dos símbolos é exibido. Os caracteres de sinalizador são divididos em 7 grupos da seguinte forma: l O símbolo é um local (l), global (g), global único (u), nem global nem local (um espaço) ou global e local (). Um símbolo não pode ser nem local nem global por uma variedade de razões, e. Porque ele é usado para depuração, mas é provavelmente uma indicação de um bug se ele é sempre local e global. Os símbolos globais exclusivos são uma extensão GNU para o conjunto padrão de ligações de símbolos ELF. Para esse símbolo, o vinculador dinâmico certificará-se de que em todo o processo há apenas um símbolo com este nome e tipo em uso. O símbolo é fraco (w) ou forte (um espaço). O símbolo denota um construtor (C) ou um símbolo comum (um espaço). O símbolo é um aviso (W) ou um símbolo normal (um espaço). Um nome de símbolo de aviso é uma mensagem a ser exibida se o símbolo que segue o símbolo de aviso for sempre referenciado.
No comments:
Post a Comment