Jak změnit jména funkcí v .so knihovně na lowercase

Dobrý den,

potřeboval bych v .so knihovně, ke které nemám zdrojáky (konkrétně libcufft.so od nvidie) zaměnit jména všech funkcí na lowercase, abych je mohl přilinkovat k programu ve Fortranu, který case ve jménech funkcí automaticky konvertuje na lowercase. Zkoušel jsem fortranovský program přeložit se zachováním case, ale pak se mi zase nedaří přilinkovat jiné knihovny. Existuje na to nějaká utilitka?

Nebo, jak by případně vypadal C-čkový wrapper, který by se o takovou konverzi postaral?

Díky,

Jakub
« Poslední změna: 22. 04. 2010, 22:34:51 od Petr Krčmář »


Re: Jak změnit jména funkcí v .so knihovně na lowercase
« Odpověď #1 kdy: 23. 04. 2010, 12:17:15 »
Obecně bych nedoporučoval měnit obsah knihovny. Vhodnejším řešením je napsat wrapper a nebo využít introperability fortranu s C.

Predpokladejme, ze v knihovne je napr. nejake funkce

int knihovniFunkce(double x);

pak by jednoduchy wrapper mel vypadat takto (soubor wrapper.c):

int kfunkce_(double *x) {
  return knihovniFunkce(*x);
}

Je treba 1) pridat spravny pocet podtrzitek (nektere prekladace davaji 0, nektere 1 a nektere 2 podtrzitka) a 2)pouzit spravnou velikost pismen a konecne 3) prizpusobit predevani parametru vcetne ohlidani typu (int neni vzdy stejne, jako INTEGER).

Pak je mozne z fortranu volat
  J = KFUNKCE(X)


Jeste lepsi se mi ale jevi pouziti interoperability fortranu a C. Ta je zavedena tusim az ve fortranu 2003, ale nektere f90/f95 prekladace (vcetne gfortranu a intelovskeo ifortu) to umi.
Ja napriklad pouzivam volani jazyka lua z fortranu a k tomu jsem si napsal modul, ktery vypada zhruba takto (kraceno):

module flua
  use ISO_C_BINDING
  ...
  interface
    subroutine lua_close(L) bind(C,name="lua_close")
      use ISO_C_BINDING
      type(C_PTR), value :: L
    end subroutine lua_close
  ...
end module flua

Predpokladam, ze pro vyse uvedeny priklad s wrapperem by stacilo misto wrapperu do fortranskeho zdrojaku dat

use ISO_C_BINDING

interface
  function kfunkce(double x) result(f) bind(C,name="knihovniFunkce")
    use ISO_C_BINDING
    integer(C_INT) :: f
    real(C_DOUBLE), value :: x
  end function kfunkce
  end function kfunkce
end interface


 

Re: Jak změnit jména funkcí v .so knihovně na lowercase
« Odpověď #2 kdy: 23. 04. 2010, 13:37:04 »
Přesně to jsem potřeboval, ISO_C_BINDING funguje báječně. Děkuji pěkně.
Jakub