問題タブ [objcopy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
strip - 共有オブジェクト ファイルからシンボルを削除できる objcopy に似たコマンドはありますか?
Linux プラットフォームで共有オブジェクト ファイルからシンボルを削除できる objcopy に似たコマンドはありますか?
linux - コンパイル済みオブジェクトの共有ライブラリ undef シンボル バージョンを書き換えます
共有ライブラリ (この例ではlibcryto & libsslですが、実際のライブラリは関係ありません)に対してリンクされているプログラム (myprog と呼びましょう) をコンパイルしてリンクしようとしています。Centos 5.5でビルドしていますが、同じバイナリを他のRHELのようなディストリビューション (CloudLinux など) でも実行したいと考えています。両方とも、同じライブラリの同じバージョンを持っていますSO_NAME
(つまり、DT_NEEDED
バージョンが対応しています)。
私の問題はこれです。Centos でコンパイルすると、次のように表示されます。
次の理由により、これは正常に機能します。
ただし、CloudLinux では:
SSL シンボルのバージョンが からlibssl.so.10
に変更されていることに注意してくださいBase
。
これは、バイナリを実行すると次のようになることを意味します。
これは「単なる警告」であることは理解していますが、これを取り除きたいと考えています。
私が望むのは、バイナリが警告なしで cloudlinux と centos の両方で実行されることです。私が知る限り、openssl ライブラリの ABI は、少なくとも私が使用する部分では同一です。myprog
現在、cloudlinux または centos ライブラリで実行することを意図しているため、共有ライブラリを変更できません。インストール時に(何らかの方法で)シンボルを修正するソリューションを受け入れobjcopy
ます。
SSL_new@libssl.so.10
1 つのアプローチは、 のエイリアスである弱いシンボルを導入するようなものですSSL_new@Base
。明らかに、それは ssl ライブラリ内のすべての単一シンボルに適用されます (したがって、ラッパーは適切ではありません)。しかし、記号を含む と の値を取得することは-Wl,--defsym=x=y
できません。x
y
@
機能する可能性のある別のアプローチは、単純にバイナリからシンボルのバージョン管理情報を削除することです (つまり、libssl.so.10
各 ssl シンボルからバージョンを削除し、名前内のバージョン管理に依存しますDT_NEEDED
)。これは単純な要求のように思えますが、その方法もわかりません。何かobjcopy
呪文はありますか?
最悪の場合、Centos 上に CloudLinux で動作する (別の) バージョンを構築しても問題ありません。私はこれをやってみました:
ただし、未定義のシンボルであると不平を言うリンクでは失敗します(CentosにはそのシンボルがないためSSL_new@Base
、Centosではそうです)。.so
これを回避する方法はありますか?
macos - osx 上のオブジェクト ファイルの編集 (cf objcopy)
osx でオブジェクト ファイルを編集するにはどうすればよいですか? たとえば、オブジェクト ファイルからシンボルの名前を変更したり、シンボルを削除したりします。binutil の gobjcopy を試しました。
これは機能しているように見えますが、ld
foo2.o をリンクするとエラーが発生します (foo.o ではエラーが発生しませんでした)。これは、最も単純な形式 ( gobjcopy foo.o foo2.o
) でも発生します。
背景: 2 つのオブジェクト ファイルで定義されている重複シンボルを削除しようとしています。
c - objcopy: 特定のセクションのコピーに失敗しました (`.rodata' が必要ですが存在しません [...])
Hello World C ファイルをコンパイルしましたが、必要なセクションは 1 つだけです (hello world 関数のみ)。
コンパイルされたファイルの形式は elf32-i386 で、次の 4 つのセクションが含まれ.rodata
て.text.hello
い.comment
ます.eh_frame
。
objcopy を使用して.text.hello
セクションのみを抽出しようとしました: http://www.thegeekstuff.com/2013/01/objcopy-examples/ example 3.
失敗し、次のように報告します。
それを解決する方法は?