4

リンク先のアプリケーションからメモリ使用量を分離できるように、共有ライブラリを作成したいと考えています。つまり、共有ライブラリを と呼びましょう を呼び出す場合libmemory.somallocそのメモリを、アプリケーションで行われた への呼び出しを処理するために使用されるヒープとは別のヒープに維持したいと考えてmallocいます。この質問は、メモリ アロケータの作成に関するものではなく、ライブラリとアプリケーションをリンクしてロードすることに関するものです。

これまでのところ、関数の挿入、シンボルの可視性、およびリンクのトリックの組み合わせを試してきました。これまでのところ、1 つの理由でこれを正しく理解できませんでした: 標準ライブラリです。アプリケーションと内部mallocで発生する標準ライブラリの呼び出しを区別する方法が見つかりません。libmemory.soこれにより、内部で標準ライブラリを使用libmemory.soするとアプリケーション ヒープが汚染されるため、問題が発生します。

malloc私の現在の戦略は、共有ライブラリに の定義を隠しシンボルとして挿入することです。これはうまく機能し、実行時に動的にロードされる標準ライブラリを除いて、すべてのライブラリ コードが期待どおりに機能します。当然のことながら、標準ライブラリの使用法を静的に組み込み、コンパイル時に挿入mallocされた inを使用する方法を見つけようとしてきました。libmemory.so私は試してみましたが-static-libgcc成功し-static-libstdc++ませんでした(とにかく、これは推奨されていないようです)。これは正しい答えですか?

どうする?

Ps、さらに読んでいただければ幸いです。質問のタグ付けに関するヘルプがあれば幸いです。

4

1 に答える 1

2

-static-libgcc と -static-libstdc++ を試しましたが成功しませんでした

もちろん、これは成功mallocません。 libgccorには存在しませんlibstdc++。に住んでいlibcます。

あなたがしたいことは、 tcmallocjemallocなどの代替実装と静的にリンクし、すべてのシンボルを非表示にすることです。そうすれば、ライブラリとアプリケーションは完全に別個のヒープを持つことになります。libmemory.somallocmalloc

言うまでもなく、ライブラリに何かを割り当ててアプリケーションで解放したり、その逆を行ったりしてはいけません。

理論的にはmalloc、 system の一部をlibc.aライブラリにリンクすることもできますが、実際には GLIBC (および他のほとんどの UNIX C ライブラリ) は部分静的リンクをサポートしていません ( をリンクする場合は、 をリンクlibc.aしてはなりませんlibc.so)。

アップデート:

libmemory.so が動的にリンクされている標準ライブラリ関数 (gmtime_r など) を使用し、それによって実行時に malloc を解決する場合、libmemory.so は実行時に提供される malloc (明らかに glibc のもの) を誤って使用します。

それについては何も間違っていません。mallocライブラリ内に隠しているため、他に使用できるものはありませんmallocgmtime_r

また、gmtime_rGLIBC 自体による内部使用を除いて、 はメモリを割り当てません。そのようなメモリは によってクリーンアップされる可能性がある__libc_freeresため、GLIBC の を使用する以外の場所にこのメモリを割り当てるのは間違っmallocています。

さて、fopenあなたが使用した別の例であり、メモリをfopen行います。どうやら、ライブラリから呼び出されたときに( からは見えなくても)自分のを呼び出しmallocたいと考えているようですが、アプリケーションから呼び出されたときに system を呼び出します。しかし、誰がそれを呼んだかをどうやって知ることができますか? 確かに、スタックを調べて、それがライブラリによって呼び出されたのか、他の何かによって呼び出されたのかを把握することを提案しているのではありませんか?fopenmallocfopenmallocfopenfopen

したがって、ライブラリを system に呼び出さないようにしたい場合は、使用し、呼び出す可能性のある他のすべての libc 関数mallocを静的にリンクする必要があります(ライブラリでも非表示にします)。malloc

uclibcまたはのようなものを使用して、それdietlibcを達成できます。

于 2016-01-30T19:30:46.490 に答える