5

私は(経由で)たくさんの.oファイルを作成しましたgcc -c $file.c $someotherops -o $file.o。次に、それらを静的ライブラリにリンクします。

ld使用するのか、これに使用するのか正確にはわかりませんgcc。マニュアルでは、ld直接使用することは想定されていないとのことです。ただし、静的ライブラリを作成するためのgccパラメーターを理解できません。

試しld *.o -static -o libfoo.aましたが、多くのシンボルが欠落していると文句を言います(すべてlibcからだと思います)。静的ライブラリであるはずなので、なぜ文句を言うのかわかりません。その静的ライブラリを他のものにリンクすると、シンボルがチェックされると思いました。

もう1つ:/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ldここで使用します(私のターゲットはiOSです)。警告で文句を言いますld: warning: using ld_classic。これは何ですか?

それから、ダイナミックライブラリを指定する必要があるのではないかと思いました。そこで-lc、libcに対するリンクを追加しました。しかし、それはと文句を言いcan't locate file for: -lcます。追加-L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/libしましたが、ありlibc.dylibます。

何か案は?


-lcエラーについて:指定してから逃げました-arch armv6。それからそれは間違っていると不平を言いました(それはそれを指定しなかったので私が推測することlibcache.dylibからリンクされなければなりません)。libc.dylib追加が役に立ち-L.../usr/lib/systemました。

これで、単一のファイルごと.oに、警告が表示されld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecatedます。これは何ですか?

そして、私はまだたくさんの欠落しているシンボルを持っています、特に:

Undefined symbols for architecture armv6:
  "start", referenced from:
     -u command line option
     (maybe you meant: _PyThread_start_new_thread)
  "___udivsi3", referenced from:
      _get_len_of_range in bltinmodule.o
      _quorem in dtoa.o
      _array_resize in arraymodule.o
      _newarrayobject in arraymodule.o
      _array_fromfile in arraymodule.o
      _get_len_of_range in rangeobject.o
      _inplace_divrem1 in longobject.o
      ...
  "___unorddf2", referenced from:
      _builtin_round in bltinmodule.o
  ...

私はそれらの記号のいくつかをチェックしました、___udivsi3例えばget_len_of_range。この関数はC演算のみを使用し、外部呼び出しは使用しません。したがって、これはのようないくつかの外部関数を使用するように変換されているよう___udivsi3です。しかし、これはどのライブラリにありますか?


-lgcc_s.1___udivsi3および関連する欠落しているシンボルのほとんどを修正しました。startシンボルはまだありません。どういう-u command line option意味ですか?


ここから、ld結局、適切なツールではないのではないかと感じました。そこでは、への単純な呼び出しarが使用されます。そして、これはもっと理にかなっているようです。それが機能するかどうかを確認し、これを答えに変換します。


もっと遊んでいる間ar、太った静的ライブラリを構築するときに私にいくつかの警告を投げてください。libtool代わりに使用するためのヒントが得られました。それが私が今していることですlibtool -static -o libfoo.a *.o。また、コンパイラをに切り替えました/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clangが、それが重要かどうかはわかりません。

ここで、この静的ライブラリにリンクするテストアプリケーションをコンパイルすると、次の警告が表示されます。

ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in __PyBuiltin_Init from /Users/az/Programmierung/python-embedded/libpython.a(bltinmodule.o). To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000004 (0x001B70CC) to 0x1001B70C4
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000000 (0x001B70CC) to 0x1001B70C4

彼らは何について?使用しません-mdynamic-no-pic_PyBuiltin_Initまた、そこで絶対アドレス指定をどのように使用するかについてもよくわかりません。

また、範囲外のこれらの絶対アドレスは何ですか?編集:これらはいくつかの本当に巨大な割り当てでした。私は今のところこのコードを削除しました(これはWITH_PYMALLOC、誰かがこれらの特定のPython内部に興味がある場合です)。

iPhoneで起動すると、中止されます。

dyld: vm_protect(0x00001000, 0x00173000, false, 0x07) failed, result=2 for segment __TEXT in /var/mobile/Applications/C15D9525-E7DC-4463-B05B-D39C9CA24319/...

リンクに使う-no_pieとリンクすらしません。それは失敗します:

Illegal text-relocation to ___stderrp in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/libSystem.dylib from _read_object in /Users/az/Programmierung/python-embedded/libpython.a(marshal.o) for architecture armv7


PIEが無効になっている、絶対アドレス指定エラーを解決しました。-staticコマンドラインにClangがありました。それを削除すると、警告とdyld/vm_protectエラーがなくなりました。実際にコードを実行するのは初めてでした。

整数比較について別の奇妙なエラーが発生するまで。これにより、これはClangビルドのバグのように見えます。

4

2 に答える 2

14

すべてが機能するようになりました。基本的に、答えは次のとおりです。

  • すべての*.cファイルを通常どおりファイルにコンパイルするだけ*.oです。唯一の本当の違いは、異なるGCC / Clang、-arch armv7異なるSDK /includedirsです。

  • libtool -static -o libfoo.a *.o静的ライブラリを構築するために使用します。

それでおしまい。私の質問の他の問題は、間違った方向への試みでした。

于 2012-06-21T00:13:16.473 に答える
1

誰かがdyld: vm_protect(...)ランタイムエラーを検索してここに到達したが、XCodeを使用している場合は-static、OPに記載されているフラグが問題である可能性があります。

LLVMコンパイラの言語設定で「共有ライブラリとのリンクを有効にする」を「はい」(デフォルト)に切り替えて、これを取り除きます。(これによりGCC_LINK_WITH_DYNAMIC_LIBRARIES = NO、プロジェクトファイルから削除されます)。

于 2013-07-24T05:06:23.343 に答える