Já estou 'trabalhando' no meu novo emprego, e me passaram uma taréfa de fazer funcionar um driver pra uma impressora fiscal Bematech.
Veio um aplicativo de testes junto com o driver e ele vai na boa, mas um aplicativozinho mínimo que fiz em Kylix não vai, da erro de acesso a memória quando vai instanciar a biblioteca...
Bem tenho que resolver isso, e como já testei várias possibilidades cheguei agora no desespero de debugar os dois aplicativos pra ver pq um funciona e o outro não.
Então encontrei onde os dois instanciam a biblioteca, existem poucas diferenças mas estas podem ser cruciais, mas preciso entender dois comandos que obtive usando o STRACE.
Dei uma googlada, mas a quantidade de logs com esses comandos é tão grande que não da pra achar alguma página me explicando o funcionamento deles

Então estou apelando aos ilustres colégas na esperança que possam me dar essas informações...
Esse é um pedaço do Log do aplicativo que da certo
open("/usr/lib/libbemafiscal.so", O_RDONLY) = 5
read(5, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320\343"..., 512) = 512
fstat64(5, {st_mode=S_IFREG|0777, st_size=4503086, ...}) = 0
old_mmap(NULL, 2239892, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 5, 0) =
0x40018000madvise(
0x40018000, 2239892, MADV_SEQUENTIAL|0x1) = 0
old_mmap(
0x40226000, 77824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 5, 0x20e000) =
0x40226000old_mmap(0x40239000, 7572, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) =
0x40239000close(5) = 0
E esse é doq da errado
open("/usr/lib/libbemafiscal.so", O_RDONLY) = 5
read(5, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320\343"..., 512) = 512
fstat64(5, {st_mode=S_IFREG|0777, st_size=4503086, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4002c000
old_mmap(NULL, 2239892, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 5, 0) =0x4002d000madvise(
0x4002d000, 2239892, MADV_SEQUENTIAL|0x1) = 0
old_mmap(
0x4023b000, 77824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 5, 0x20e000) =
0x4023b000old_mmap(0x4024e000, 7572, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) =
0x4024e000close(5)
da pra notar que o log que deu erro, tem uma instrução
old_mmap a mais.
Como o parâmetro resultante de
old_mmap é utilizado na instrução
madvise da pra concluir que o
old_mmap retorna um endereço de acesso, talvez a alguma função ou algo tipo MAIN da biblioteca.
Um retorno errado desse endereço justifica o erro
SIGSEV(11) ou
Segmentation fault ou ainda
Runtime error 230.
São todos o mesmo erro mas sendo mostrados em níveis diferentes de informação.
Bem pra entender oq ta acontecendo ou pelo menos saber se estou 'na pista certa' ou na errada, preciso entender o funcionamento dessas duas funções.
Portanto
Oque são "old_mmap" e "madvise" 