20110107

Conserto de erros de linkedição em mipsel

Um erro recorrente quando da linkedição para alvos mips little-endian é:

$xxx/../lib/gcc/mipsel-linux-uclibc/4.2.0/../../../../mipsel-linux-uclibc/bin/ld: non-dynamic relocations refer to dynamic symbol memcpy
$xxx/../lib/gcc/mipsel-linux-uclibc/4.2.0/../../../../mipsel-linux-uclibc/bin/ld: failed to set dynamic section sizes: Bad value

Resolve-se o dito cujo adicionando -fPIC à compilação.

20101122

Conflito entre toolchain Go e Inferno

Na linkedição de um programa trivial em Go, o seguinte erro ocorria:
freesg: symtab: not defined
freesg: esymtab: not defined
freesg: pclntab: not defined
freesg: epclntab: not defined

Em $HOME/bin havia um linker Go antigo, o que causava o problema. Removido este, problemas diferentes apareceram. Estes, por fim, eram devidos ao caminho para o linker da árvore do Inferno ser anterior ao caminho do Go em $PATH.

Como o kencc do Inferno não é usado a menos que se vá mexer no kernel, optei por deixar o caminho deste sempre posterior ao do Go.

20101031

Mapeando a tecla Windows para Control no X

% cat $HOME/.xmodmap
add control = Super_L

20100926

ROOT e pyROOT no Ubuntu

No Ubuntu 8.10, para usar ROOT e pyROOT é necessário instalar root-system-bin, root-system-common, root-plugin-python e libroot-python-dev.
Após isso, um
import ROOT
no python deve funcionar.

20100910

Hg através de proxy SOCKS5

Adicione ao $HOME/.ssh/config

Host repository-host
        ProxyCommand /bin/nc -X5 -x socksproxy:port1 %h %p
        Compression yes

Aprendi em http://blogs.sun.com/cwb/entry/using_the_opensolaris_mercurial_repository

20100708

Selecionando uma linha no acme pelo shell

Para atingir o mesmo efeito de clicar em :n com o botão 3, pode-se fazer pelo shell:
echo -n $line > /mnt/acme/$wid/addr
echo 'dot=addr' > /mnt/acme/$wid/ctl
Onde $line é o número da linha e $wid é o número da janela.

20100705

Judiciously placed print statements

A trabalhar numa arquitetura na qual o gdb não está sendo muito amigável [1] e por conta de preguiça, precisei saber todas as funções que eram chamadas diretamente num determinado programa escrito em C (linux/gcc).
Para tal desenrolei em rc(1) usando sed(1) do Plan 9 from User Space:
for(i in *.c) {
 sed 's/^{$/{\nprint("%s >>>\\n", __FUNCTION__);/g;' $i > $i.new
 mv $i.new $i
}

Por ser uma rotina ingênua alguns erros surgiram em declarações de structs e enums, mas comparado ao benefício, me parece valer a pena.

[1] Bibliotecas dinâmicas + gdb para mips rodando em 386 = .dynamic section for "/lib/libm.so.6" is not at the expected address (wrong library or version mismatch?)

ps: O título é uma alusão à "The most effective debugging tool is still careful thought, coupled with judiciously placed print statements." de Brian Kernighan.