Chamando funcao marcada com EXPORT_SYMBOL

1. Chamando funcao marcada com EXPORT_SYMBOL

Guilherme Giacomo Simoes
simoes_png

(usa Arch Linux)

Enviado em 27/04/2023 - 14:11h

Estou tentando executar uma funcao de um modulo pra linux que eu construi, mas nao obtenho sucesso.
Esse e o link do projeto: https://github.com/GuilhermeGiacomoSimoes/fp_printk

Eu criei uma pequena funcao para converter um interiro e uma string float:

void fp_printk(int number, int decimal_places, char* destination)
{
printk(KERN_INFO "um test no inicio");
static char buffer[32] = { 0 };
int buf_index = 30;
int count_decimal_place = 0;
int point_include = 0;

for (; number && buf_index; --buf_index, number /= 10) {
count_decimal_place++;
if (!point_include && count_decimal_place > decimal_places) {
buffer[buf_index] = '.';
buf_index--;
point_include = 1;
}

buffer[buf_index] = "0123456789"[number % 10];
}

strcpy(destination, &buffer[buf_index + 1]);
}
EXPORT_SYMBOL(fp_printk);


Depois que ele converte o inteiro em uma string com ponto flutuante, ele da um strcpy() para o *destination.

Se eu chamar a funcao fp_printk() de dentro do proprio modulo na funcao init, ele funciona normalmente:

static int __init fp_printk_init(void)
{
printk(KERN_INFO "%s: initial execute module", OURMODNAME);
char *dest = kmalloc(sizeof("12.34"), GFP_KERNEL);
fp_printk(1243, 2, dest);
printk(KERN_INFO, "%s", dest);
return 0;
}


Porem eu criei um outro modulo somente para teste chamando o fp_printk() passando os parametros corretamente.
Esse outro modulo somente e para fins de teste, pq afinal a lib que criei e para ser usada por outros modulos, drivers e libs .. .

Entao fiz isso:
    
printk(KERN_INFO, "before exec\n");
char *r = kmalloc(sizeof("12.34"), GFP_KERNEL);
extern __visible void fp_printk(number, decimal_places, r);
printk(KERN_INFO, "%s: %s\n", "test_fp_printk", r);
printk(KERN_INFO, "after exec\n");


Mas quando eu rodo o **dmesg** Para visualizar os printk`s eu somente vejo:

[1210228.128703] test_fp_printk: before exec
[1210228.128712] test_fp_printk: after exec


Ele printa o printk() antes da conversao e printk() depois da conversao ... porem o printk() que contem a variavel *dest nao printa de foram alguma.

Eu somente preciso que a variavel *destination seja preenchida com a string float.





  


2. Re: Chamando funcao marcada com EXPORT_SYMBOL

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 27/04/2023 - 14:12h

Olá! Pelo que entendi no seu projeto, você está tentando utilizar a função `fp_printk()` do seu módulo como uma biblioteca para outros módulos do Linux. Vamos analisar seu problema:

Quando você tenta chamar a função `fp_printk()` em um segundo módulo, isso não funciona pois o módulo de destino não possui a referência para a função `fp_printk()`. Essa função foi exportada com `EXPORT_SYMBOL`, mas também é necessário importá-la no módulo que a utilizará.

Para fazer isso, siga os passos abaixo:

1. No módulo teste, inclua o cabeçalho com a definição da função `fp_printk()`. Se você ainda não criou um arquivo de cabeçalho para esta função, crie um com o nome `fp_printk.h` e insira o seguinte conteúdo:

```
#ifndef FP_PRINTK_H
#define FP_PRINTK_H

void fp_printk(int number, int decimal_places, char* destination);

#endif
```

2. No arquivo de código-fonte do módulo teste, inclua o cabeçalho `fp_printk.h`:

```c
#include "fp_printk.h"
```

3. Agora chame a função `fp_printk()` no módulo de teste:

```c
printk(KERN_INFO "before


3. Re: Chamando funcao marcada com EXPORT_SYMBOL

Guilherme Giacomo Simoes
simoes_png

(usa Arch Linux)

Enviado em 29/04/2023 - 00:08h

Continuo com o mesmo problema.
Mesmo que importo o header #include "fp_printk.h"

printk() com o resultado nao e impresso.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts