0

こんにちは、関数を動的にロードして実行しています。コンパイラがスタックを適切にクリーンアップできるように、一般的な戻り値の型を定義できるようにしたいと考えています。現在、バージョン文字列の印刷が意味不明です。

次のコードを機能させるにはどうすればよいですか?

// gcc -o test test.c -ldl

#include <stdio.h>
#include <dlfcn.h>

typedef union  { int i; double d; float f; char *p;} anytype; 

int main()
{
  anytype ver2;

  anytype (*f)();

    void *handle = dlopen("libz.so.1", RTLD_NOW|RTLD_GLOBAL);
    f = dlsym(handle,"zlibVersion");
    //const char * zlibVersion (void);
    ver2=f();
    printf("zlib version %s\n", ver2.p);
    dlclose(handle);

    return 0;
}
4

1 に答える 1

1

union残念ながら、 a を使用して、不明な型の戻り値を置き換えることはできません。浮動小数点レジスタを持つアーキテクチャでは、浮動小数点の戻り値は浮動小数点レジスタに返され、整数またはポインタの戻り値は汎用レジスタに返されます。通常、戻り値が共用体または構造体の場合、呼び出し元は、呼び出し先が戻り値で埋める (正しいサイズの) ストレージ領域を指す最初の引数を提供する必要があります。(多くのバリエーションがあります。プラットフォームの ABI に完全に依存しています。私が説明したのは、i386 ABI (の一部) です。)

したがって、関数を呼び出すには、関数のシグネチャを知る必要があります。

于 2013-04-25T17:26:00.467 に答える