在 AIX 上编译的帮助
有没有一个网站可以找到特定库中使用的符号及其版本。 例如,我尝试使用 gcc 在 AIX 上编译一些代码,它引发了很多未定义的符号错误 例如,下面是一个输出:
ld: 0711-317 ERROR: Undefined symbol: .__fixdfdi
ld: 0711-317 ERROR: Undefined symbol: .__divdi3
ld: 0711-317 ERROR: Undefined symbol: .__moddi3
ld: 0711-317 ERROR: Undefined symbol: .__floatdidf
ld: 0711-317 ERROR: Undefined symbol: .__umoddi3
ld: 0711-317 ERROR: Undefined symbol: .__udivdi3
ld: 0711-317 ERROR: Undefined symbol: .__fixunsdfdi
我到哪里去查找这些符号的位置。 如果我在 Linux 上运行相同的 gcc
命令,它运行得很好。
我也尝试过包含 -lgcc
,但它再次为某些 register_frame
抛出未定义的符号......等等等等...... 我已经厌倦了 AIX。
对此的任何帮助将不胜感激..并且请不要在这个问题上麻烦谷歌搜索。 你最终将无处可去。
许多人问过此类问题,但没有答案。
谢谢
Is there a site where I can find the symbols used in a particular library and its version.
For e.g. I m trying to compile some code on AIX using gcc, and it throws me a lot of undefined symbol errors
For example, here is an output:
ld: 0711-317 ERROR: Undefined symbol: .__fixdfdi
ld: 0711-317 ERROR: Undefined symbol: .__divdi3
ld: 0711-317 ERROR: Undefined symbol: .__moddi3
ld: 0711-317 ERROR: Undefined symbol: .__floatdidf
ld: 0711-317 ERROR: Undefined symbol: .__umoddi3
ld: 0711-317 ERROR: Undefined symbol: .__udivdi3
ld: 0711-317 ERROR: Undefined symbol: .__fixunsdfdi
Where do I go to find where these symbols are.
If I run the same gcc
command on Linux, it runs fine.
I tried including -lgcc
also but then again it throws undefined symbols for some register_frame
...blah blah...
and I m getting sick of AIX.
Any help on this would be appreciated..and please don't bother Googling on this issue.
You will end up no where.
Many have asked this kind of questions but no answers.
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这些是数学符号。 尝试将 -lm 添加到您的链接行。
Those are math symbols. Try adding -lm to your link line.
自从我在 AIX 上编译任何东西以来已经有很长一段时间了(值得庆幸的是),我确实感受到了您花了一年左右的时间试图在 AIX 上构建我们公司的 JNI 和其他软件库的痛苦。
我似乎确实记得 GCC 从来没有工作得特别好,因为它总是出现类似的错误。 是否有任何选项可以使用本机编译器(xlC)?
如果我没有检查你的库的顺序,它在使东西正常工作方面发挥了重要作用。
我认为你已经使用 nm 实用程序来迭代 /usr/lib (等)中的每个库以查找缺失的符号找到了吗?
It's been a long time since I compiled anything on AIX (thankfully) and I do feel your pain having spent a good year or so trying to get our company's JNI and other software libraries built on AIX.
I do seem to remember that GCC never worked particularly well as it always came up with similar errors. Is there any option to use the native compiler (xlC)?
Failing that I would check the ordering of your libraries, it plays a big part in making stuff work properly..
I take it that you have use the nm utility to iterate through every library in /usr/lib (etc) to find where the missing symbols are located?
这是因为您使用了gcc来编译一个库,并且您想要链接到使用xlc编译的代码。 或者至少是我的情况
你有2个选择:
This is because you used the gcc to compile a library you want to link to a code compiled with xlc. Or at least is my case
You have 2 options:
主要问题是:
当使用在 AIX 的低版本上编译的 GCC 版本时,我曾见过这种错误。 例如,如果 GCC 是为 AIX 4.3.3 编译的并且正在 AIX 5.x 上运行。 通常,如果 GCC 是在 AIX 的高版本上编译的,则它不会在低版本上运行,因此这不太可能是问题。
另一种(不太可能)的可能性:您的 GCC 是否安装在编译时预期安装的位置? 当您构建它时,您指定(可能隐式地)安装位置(默认情况下,在
/usr/local
下)。 如果您的副本安装在其他地方,但/usr/local
中有一个旧的 GCC,并且您的副本预计安装在/usr/local
中,那么您可以运行陷入此类问题。 这比版本不匹配的可能性要小得多。Mostly questions:
I've seen that sort of error when using a version of GCC compiled on a down-version of AIX. For example, if the GCC was compiled for AIX 4.3.3 and is being run on AIX 5.x. Usually, if GCC was compiled on an up-version of AIX, it won't run on the down-version, so that is unlikely to be the problem.
One other (rather unlikely) possibility: is your GCC installed where it was compiled to expect to be installed? When you build it, you specify (possibly implicitly) the install location (by default, under
/usr/local
). If you have your copy installed somewhere else, but there's an old GCC in/usr/local
and your copy expects to be installed in/usr/local
, then you can run into this sort of problem. This is much less likely than version mismatching.列出的外部符号来自
libgcc
,因此添加-lgcc
是正确的。register_frame
也是libgcc
的一部分,但仅适用于 32 位。 检查您的编译器、链接器和库是否使用相同的位深度模式。Listed external symbols are from
libgcc
so add of-lgcc
is correct. Andregister_frame
also is part oflibgcc
but only for 32-bit. Check if you use the same bit depth mode for you compiler, linker and libraries.