sexta-feira, 19 de setembro de 2008

Portando Aplicativo Windows Ce de X86 para ARM

Palavras Chave: Pocket PC Windows CE Win CE

Essa semana me foi passada a tarefa de portar um aplicativo que temos para ThinClients Windows CE rodando em processadores X86 para Windows CE Pocket PC 2003 em ARM.

Bom, comecei criando o solution para o ARM copiando as configurações do X86 ja existentes e trocando na mãos os defines" onde necessário.
Tudo compilou legal ate que na hora de "linkar" fui presenteado com algumas dezenas de erros.
Foram muitos erros mas a maioria deles reclamava da mesma coisa
Abaixo mostro o copy-and-paste de alguns deles:

error LNK2001: unresolved external symbol "public: __cdecl std::exception::exception(char const *)" (??0exception@std@@QAA@PBD@Z)
error LNK2001: unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
error LNK2001: unresolved external symbol "public: virtual char const * __cdecl std::exception::what(void)const " (?what@exception@std@@UBAPBDXZ)
error LNK2001: unresolved external symbol "public: virtual __cdecl std::exception::~exception(void)" (??1exception@std@@UAA@XZ)

Percebi que praticamente todos símbolos estavam relacionados as classes de tratamento de exceção.
Futuca aqui mexi ali e nada.
Até que resolvi criar um solution do zero para verificar quais configurações o Visual Studio 2005 colocava em seus projetos.

Resolvi olhar no stdafx.h criado por default e vejo isso:

#if (_WIN32_WCE < 0x500) && ( defined(WIN32_PLATFORM_PSPC) ||
defined(WIN32_PLATFORM_WFSP) )
#pragma comment(lib, "ccrtrtti.lib")
#ifdef _X86_
#if defined(_DEBUG)
#pragma comment(lib, "libcmtx86d.lib")
#else
#pragma comment(lib, "libcmtx86.lib")
#endif
#endif
#endif

Hum...interessante.
Nos projetos ARM ele inclui o ccrtrtti.lib.
Pesquisando na internet encontro isso.
Pronto, mexi nas propriedades do vcproj e mandei incluir o ccrtrtti.lib e tudo foi perfeito.
Bom, agora só falta testar no dispositivo. Se tiver alguma coisa de interessante postarei aqui.
Se quiser saber mais para que serve o ccrtrtti.lib basta ler o link inserido anteriormente.
Minhas restrições de tempo me impedem de escrever detalhes.
[]'s

Leonardo X. T. Cardoso

sexta-feira, 12 de setembro de 2008

ScreenShot do dia

Criando código para listar as interfaces de rede no Solaris.
Graças ao OpenSolaris pude verificar como os engenheiros da Sun implementaram
o ifconfig.

Softwares utilizados

1. Mac OS X.
2. Jedit.
3. Fugu - (A Mac OS X SFTP, SCP and SSH Frontend)
4. Terminal.

Para visualizar o screenshot clique AQUI

quarta-feira, 3 de setembro de 2008

Compilando o GCC no HP-UX 11.X

Neste post explicarei como compilar seu próprio GCC no HP-UX 10.x.

No ambiente onde trabalho, um de nosso objetivos é suportar o maior número possível de versões de HP-UX. Por isso usamos o GCC versão 3.4.4 por conta das chatices de incompatibilidade da libc.
Com isso, conseguimos gerar binários que funcionam tanto nos sistemas antigos quanto nos novos. E acredite, muitos clientes tem ambientes bastante desatualizados.
Como regra geral eles pensam: para que atualizar se esta funcionando 100% e eu não preciso das novas features ? Até faz sentido. Mas nem irei entrar no mérito das conseqüências deste tipo de atitude. Principalmente questões de segurança.

Bom, voltando ao que interessa.....

Eu uso o GCC apenas para compilar código C/C++ e por isso neste exemplo irei usar apenas os pacotes que interessam: (i) gcc-core e (2) gcc-g++.

Agora vamos aos passos para compilar o GCC 3.4.4 no HP-UX 11.23

1. Instalar uma distribuição binária do GCC. Este GCC será usado para compilar o seu GCC "customizado". Pode ser inclusive um GCC 4.x. Tentei compilar usando o compilador C do HP mas não teve jeito. Após muita dor de cabeça resolvi usar o próprio GCC. Após a instalação, os binários do GCC estarão localizados em /usr/local/bin

2. Adicionar no PATH a pasta onde estão os binários do GCC. (export PATH=$PATH:/usr/local/bin)

3. Setar a variável de ambiente CC para gcc (export CC=gcc)

4. Extrair os fontes do GCC. ex: /opt/gcc-3.4.4

5. Configurar o build do GCC. É obrigatório usar o linker e assembler da GNU. A linha de comando final seria "./configure –prefix=/opt/gcc –enable-threads –with-gnu-as –with-gnu-ld –with-languages=c,c++"

6. Remover o assembler da HP do PATH.

7. Corrigir o header math.h. Pelo menos no meu pacote veio faltando um #endif. Para corrigir basta inserir um #endif no final do arquivo math.h. Talvez se a plataforma não for IA64 isso não é necessário. Enfim, só faça se algum erro no math.h interromper o build.

8. Compilar o pacote. make

9. Criar a pasta de instalação. Em meu caso sempre uso /opt/gcc/ (mkdir /opt/gcc)

10. Instalar pacote. (make install)

Se tudo correr bem, neste ponto você terá uma distribuição completa do GCC instalada em /opt/gcc. Adicione a pasta /opt/gcc/bin no seu PATH e seja feliz.

Agora você pode remover o pacote binário que você instalou anteriormente.

Bom, por hoje vou ficar aqui.
Em outro post irei explicar como fazer binários estáticos que pode ser executados em qualquer ambiente com qualquer versão do HP-UX. Você vai precisar dos arquivos objetos gerados na compilação do GCC para gerar a libstdc++.a e a sua própria distribuição da libstdc++.so.

Se você tem muitos componentes é uma boa idéia enviar sua versão do libstdc++.so junto com seus pacotes. Assim você garante que não vai haver conflitos com diferentes versões desta shared library instaladas por ai nos ambientes insanamente genéricos que os clientes possuem.

Abraços.

Leonardo X. T. Cardoso

segunda-feira, 1 de setembro de 2008

nfs mount: mount: /mnt/cvs: Not owner

Hoje ao tentar montar meu diretório remoto localizado em um servidor Fedora Linux a partir de um Solaris 10 obtive a seguinte mensagem (inútil por sinal) de erro:

# mount cvs:/home/cvs/lcardoso /mnt/cvs
nfs mount: mount: /mnt/cvs: Not owner
#

Pesquisando um pouco pela internet descobri que isso é um problema com o NFS versão 4 no Linux e Solaris 10.

Para resolver basta editar o arquivo:

/etc/default/nfs

and mudar a linha

#NFS_CLIENT_VERSMAX=4

para

NFS_CLIENT_VERSMAX=3

Outra opção é usar o seguinte comando no momento em que for montar o sistema de arquivos:
mount -o vers=3 cvs:/home/cvs/lcardoso /mnt/cvs

Novo Livro - Advanced Programming in the UNIX Environment


Hoje chegou mais um clássico em minha porta.

Trata-se do livro Advanced Programming in the UNIX Environment cujo autor é o W. Richard Stevens.

Ele já é um velho conhecido dos tempos da Universidade Federal de Ouro Preto.
Na época tínhamos apenas um exemplar que infelizmente foi roubado por algum aluno.

É o livro obrigatório de qualquer entusiasta Unix.

Esses dias passeando pela amazon.com resolvi verificar o preço e vi que poderia comprar um usado por míseros 7 dólares mais 12 dólares de frete para o Brasil.
Por menos de 50 reais pude adquirir o clássico número um sobre desenvolvimento em Unix.

Ná época de seu lançamento não existia farto material sobre o assunto e o Stevens lançou essa obra prima. Apesar de sua idade (quase 20 anos) boa parte do conteúdo continua atual.

O Stevens é autor de diversos outros livros sobre o assunto, incluindo edições focadas em TCP/IP, programação em rede e comunicação inter-processos.

O cara era simplesmente o Guru dos Gurus.

Infelizmente ele morreu em 1999 com apenas 48 anos em conseqüência de um ataque cardíaco.

Quem sabe um dia não conto um pouco mais da história do W. Richard Stevens.

Por enquanto segue abaixo algumas referências.