Erro de sintaxe: palavra inesperada (esperando “)”) ao executar remotamente, mas nenhum problema em execução localmente

2

Eu já li muitas discussões sobre várias possibilidades de por que tal coisa pode acontecer, mas todas são sobre alguma biblioteca em falta no sistema onde os binários estão implementados. Este não é o meu caso.

Eu tenho um Raspberry Pi 2 com o mais recente Raspbian e um notebook Debian 8 com arquitetura x86-64 da Intel e um Qt Creator 3.2.1 instalado no segundo, onde eu cruzo meus binários usando o arm-linux -gnueabihf-g ++ (usando o repositório Emdebian ). Não estou usando o compilador otimizado fornecido no repositório oficial do github RPi .

Aqui está prequal ao meu problema . Depois de muito suor e palavrões, consegui compilar e implantar meu binário do notebook no RPi2. E aqui está o problema:

  • Quando tento executar meu binário a partir do Qt Creator (que se conecta ao RPi2 via SSH, transfere arquivos via SFTP e faz login como meu único usuário RPi (por isso, "problema de acesso" é excluído aqui)) meu caderno recebo:

    Erro de sintaxe: palavra inesperada (esperando ")")

  • Quando tento executar meu binário diretamente no meu RPi , ele é executado sem um único problema.

Como eu postei em stackoverflow, meu código contém apenas C ++ puro escrevendo um arquivo de texto no diretório onde o binário está em execução. Nada estranho acontecendo lá.

Então, a questão principal aqui é essa questão relacionada ao Criador do Qt ou algo muito mais profundo? Não tenho idéia de como exatamente o Qt Creator internamente executa o binário no sistema remoto. Se eu me conectar via SSH ao meu RPi via terminal e executar o binário, ele funciona bem. Então tem que fazer algo com o modo como o Qt Creator o executa. Note que a execução do binário ARM no meu notebook retorna o que todos esperamos (RPiCrossCompileRemoteTest é o nome do meu binário):

bash: ./RPiCrossCompileRemoteTest: cannot execute binary file: Exec format error

Então, o Qt Creator não inicia o binário diretamente no RPi nem tenta iniciá-lo no meu bloco de notas (caso contrário, ele teria me dado o erro de formatação de cima).

Alguma idéia de como posso proceder para resolver isso? Eu tenho lutado com essa questão por um par de dias todos em vão. : - /

EDIT: Conforme sugerido por @steve executando ldd em ambos os executáveis:

  • No RPi:

    /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0x76f84000)
    libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0x76ea3000)
    libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0x76e32000)
    libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x76e0a000)
    libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76cda000)
    /lib/ld-linux-armhf.so.3 (0x76f91000)
    
  • No notebook:

    not a dynamic executable
    

O segundo está correto. Eu não sei o que pensar sobre o primeiro embora.

Também usei o g ++ - arm-linux-gnueabihf que está no meu Raspbian para compilar um novo binário para comparar ambos. A saída de ldd é literalmente a mesma com a pequena exceção de que eu tenho endereços de memória diferentes (os números HEX entre colchetes) onde as libs serão carregadas.

EDIT 2: Como @gogoud sugeriu:

  • Alterado para a autenticação principal
  • Concha marcada no meu RPi - é bash
  • Adicionou RequestTTY=force a um recém-criado ~ / .ssh / config

Nenhuma mudança. Mesma história de sempre. No entanto, observei o código de saída real: 2 . De TLDP :

2: Misuse of shell builtins (according to Bash documentation) Example: empty_function() {} Comments: Missing keyword or command, or permission problem (and diff return code on a failed binary file comparison).

Isso não faz sentido para o meu binário (eu acho). Também verifiquei as permissões: drwxr-xr-x . Isso significa que todos podem executá-lo e lê-lo.

    
por rbaleksandar 18.08.2015 / 20:20

1 resposta

1

Parece-me que o QCreator está usando o tipo de shell errado no seu RPi2? A mensagem de erro sugere que o shell não pode criar um tipo de matriz, o que pode indicar que ele está sendo executado em vez de bash.

Se este for o caso, você precisa encontrar uma maneira de 'forçar' um login ssh no RPi2 para usar um determinado shell (provavelmente o bash). Uma maneira limitada é usar o (s) comando (s) forçado (s) com login ssh baseado em chave e não em senha. No entanto, isso limitaria esse usuário a executar um único conjunto de comandos no login.

Você poderia tentar usar o chsh no RPi2 para o usuário relevante definir o shell padrão como / bin / bash? Se já estiver configurado para isso, você poderia tentar adicionar RequestTTY = force em ~ / .ssh / config para o usuário cliente em sua máquina local (na qual você executa o QtCreator).

    
por 19.08.2015 / 08:11