• ベストアンサー

Linux で動的に動的結合をするには?

Linux でプログラム中からモジュールを読み込んでその中の関数を実行するにはどうしたらよいのでしょう。(ついでにモジュールの作り方も) Windows の LoadLibrary & GetProcAddress に相当することです。

  • nyo
  • お礼率100% (1/1)

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

LoadLibrary() → dlopen() GetProcAddress() → dlsym() FreeLibrary() → dlclose() です。詳細は man で。 共有ライブラリを作るには、-G オプションを指定して ライブラリのリンクをします。 Windows系とちょっと違うのは、ライブラリの検索パスに カレントディレクトリが *デフォルトで含まれない* こと です。 それだけ注意していれば、マニュアルを見るだけで大丈夫でしょう。

nyo
質問者

お礼

ありがとうございました man のディレクトリを漁ってはみたんですが、セクション 2 だと思っていたので。3 だったんですね。しかもここにある RedHat 7 だと日本語しかない。man -K でひっかからないわけだ。

関連するQ&A

  • Linux上で実行関数使用

    Windowsで作成したphpプログラムをLinuxに移動させようとしています。 そのプログラムの中ではC言語で作成したプログラムの実行形式(.exe)をshell_execを使って実行させています。 Linux上で動作させる場合は.outを実行すればよいとはわかるのですが、 どの実行関数を試してみてもパスが通らないか、通っても動作していなor結果が返ってこないようで、全く反応がありません。 .outを単体で実行させた場合は問題なく動作するので、C言語のプログラム上の間違いではないです。 どなたかLinux上で、phpで実行形式を動かす方法を知りませんか?

    • 締切済み
    • PHP
  • linuxでの実行中のプログラムのトレースの仕方

    アスタリスクというlinuxで動作するpbxのオープンソースのC言語のソフトがあります。 アスタリスクを立ち上げたとき、関数がどういう順序で呼び出されているかを調べる必要があります。 そこで、http://www.geekpage.jp/blog/?id=2007/1/17を参考にgdbでアタッチしてみましたが、一部 しか表示されないのででうまくいきませんでした。(全関数の呼び出しを表示するにはメモリ・レジスタが不足と出ました) 実行中の複数のモジュールが絡み合うプログラムの関数の呼び出され方を調べるのに、なにか良い方法がありましたら教えて下さい

  • LInuxとWindowsでのPerlの動作の違い

    LinuxでCGI(Perl)プログラムを作っています。 いつも動きの確認は自分のPC(Linux)と友人のPC(LInux)で行なっていました。 そして、昨夜別の友人のPC(Windows XP)を使う機会があってついでにそのPC上でプログラムを動かしてみたら一部が正確に動作してくれませんでした。でも、その後自分のPCで実行すると正確に動作してました。 WindowsとLinuxで動作に差がでるものなのでしょうか?

    • ベストアンサー
    • Perl
  • DLL関数を使ったプログラム

     DLL関数を使ったプログラムを動かしたんですが、ERRORが解決できず 困っています。DLLを作成したのはいいのですが、それをLoadLibraryで読み込もうとしても指定したプロシージャが見つからないというエラーになるようです。使用している環境はVisual Studio.NET2003です。  以下はDLLのソースです。 // plug.c // #include <windows.h> #include <stdio.h> __declspec(dllexport) void CALLBACK TestFunc() {    printf("DLLのTestFunc()関数が実行されました。\n"); } これをビルドするとplug.dllとplug.expとplug.libが作成されました。  そしてこれを使用したプログラムが // stab.c // #include <windows.h> #include <stdio.h> typedef void (*TestFunc)(void); void main() {     HMODULE hModule;     DWORD error;     TestFunc funcPointer;     hModule = LoadLibrary(TEXT("plug"));     error = GetLastError();//error値が127     funcPointer = (TestFunc)GetProcAddress(hModule,TEXT("TestFunc"));     funcPointer();     FreeLibrary(hModule);     getchar(); } LoadLibrary関数を使用してアプリのメモリ空間にDLLを読み込もうとしているんですが、ここでハンドルが正確に渡されていないみたいなんです。どうしてこうなるのか分かりません。わかる方いらっしゃったらよろしくお願いします。

  • VC++6.0からVB.NETで作成した関数を呼ぶことができますか?

    VB.NET(Visual Basic 2005 Express Edition)でクラスライブラリ(AAA.dll)を作成し、BBBというModuleにCCCというFunctionをひとつ作成しました。 そのFunctionをVC++6.0で作成したプログラムから呼び出すことは可能でしょうか?また、可能な場合はどのような手順で呼び出すことができるのでしょうか? ■VB6.0でDLLを作成した場合 DLLのファイル名とFunction名さえ指定すればVC++6.0よりLoadLibrary、GetProcAddress関数を使用して呼び出せる。 ■VB.NETでDLLを作成した場合 DLLのファイル名+Module名+Function名という構成になってしまい、従来のLoadLibrary、GetProcAddress関数ではModule名が指定できないように思われるのですが・・・どうなんでしょう。 ご存知の方いらっしゃいましたらご教授お願いいたしますm(_ _)m

  • LINUXでのプログラムの実行方法(超初歩的な質問です)

    小生はLINUXをはじめて扱うものです。超初歩的な質問で恐縮ですが、LINUXでプログラムを実行するのはどうすればよろしいのでしょうか。Windowsのように、プログラムファイルをダブルクリックしても、LINUXでは実行されないようです。LINUXのバージョンはVINE3.0です。

  • BASP21のKconvをVCから利用する方法

    BASP21のKconvをVCから利用する方法をご存知の方はいらっしゃいますでしょうか? 下記のように LoadLibrary、GetProcAddressを使いVC上からの実行を試しているのですが どうにもうまくいきません。(EUCからUTF-8) Kconvの実行個所でおちてしまいます。 何かわかりましたらお願いします。 typedef void*(*KCONV)(void*, int, int); HINSTANCE hLibModule = NULL; KCONV Kconv = NULL; hLibModule = ::LoadLibrary(_T("Binetx.dll")); Kconv = (KCONV)::GetProcAddress(hLibModule, "Kconv"); strOutStr = (char*)Kconv((void*)strInStr, 5, 2);

  • Vine Linuxのプログラムの実行方法

    はじめまして。私はLinux初心者です。 Windowsが入っていたノートPCでOSが立ち上がらなくなったのでVineLinuxをインストールしてみたのですが、プログラムの実行方法がわかりません。 プログラムファイルから「実行」や「端末で実行」をしてもウィンドウの中に文字列がずらずらと出たあと、唐突にウィンドウが消えてしまいます。 また、Gnomeから「/home/@@@@/Desktop/@@@@」 などとプログラムの名前など入れてみましたが 「ディレクトリ /usr/sbin/@@@@ を削除できません 許可がありません  make: *** [install] エラー 1 Oops! It looks like make install failed.」 と表示され、そこでとまってしまいます。 (このプログラムは他のPC(WindowsXP)でダウンロード&解凍したものをUSBメモリーにコピーして移動させたものです。インターネットにはまだ接続できないのでこのような方法をとりました。) プログラム自体はLinuxで使うものなので、こちらの操作方法が間違っているのだと思います。 これを実行するにはどうしたらよいのでしょうか? どうかよろしくおねがいします。

  • LinuxとWindowsについて

    学校のプログラミングと言う授業でOSがLinuxのPCを使ってプログラムを書いています。  Emacsと言う文書ソフトでプログラムを書き、ktermと言うソフトでコンパイル&実行する。  と言った感じです。しかし家のPCはWindowsな為、家で復習する事ができません。家でも実際にプログラムを書いて動くかどうか試行錯誤しながらプログラムを覚えていきたいと思うのですが。。。そこで質問です。windowsのPCでも学校のLinuxのPCと同じような感じで、プログラム作成&コンパイル&実行できるフリーソフトを紹介してください。コンパイルなどの仕方などが多少変わっても構いません。どうかお願いします。

  • C++DLLの明示的リンクに関して

    DLLを明示的リンク(LoadLibraryとGetProcAddressを使用して)で使うとき、C言語では、関数名がそのまま利用できますが、C++では、オーバーロード機能があるため、関数名が変化してしまいます。C++でDLLを明示的リンクで使用するにはどうしたら良いのですか?

専門家に質問してみよう