-h和 -h之间的区别和 -o<输出文件>抄送 (C++) 中的选项

发布于 2024-08-15 03:03:26 字数 101 浏览 10 评论 0原文

我正在构建 .so 库,想知道 -b/w -h 和 -o cc 编译器选项(使用 Sun Studio C++)有什么区别?

他们不是指的是同一件事 - 输出文件的名称吗?

I am building .so library and was wondering - what is the difference b/w -h and -o cc complier option (using the Sun Studio C++) ?

Aren't they are referring to the same thing - the name of the output file?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花开雨落又逢春i 2024-08-22 03:03:26

-o 是将由编译器写入磁盘的文件的名称

-h 是将记录在链接到该文件的 ELF 二进制文件中的名称。

一种常见用途是提供库次版本号。例如,如果
你正在创建共享库 libfoo,你可以这样做:

cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1

然后,如果你编译你的 hello world 应用程序并使用 hello 的 elf 二进制文件链接它,

cc -o hello -lfoo

将为 libfoo.so 记录一个 NEEDED 条目.1(您可以
通过运行 elfdump -d hello 查看)。

然后当您稍后需要添加新功能时,您可以将 -o 值更改为
libfoo.so.1.1 但将 -h 保留在 libfoo.so.1 - 您已经构建的所有程序
1.0 仍然尝试在运行时加载 libfoo.so.1 ,因此可以继续工作而不会被
重建,但你会通过 ls 看到它是 1.1。

在同一目录中构建库时有时也会使用此方法
在运行时使用,如果没有单独的安装目录或安装
通过包装系统。为了避免您运行时崩溃的程序
覆盖库二进制文件,并避免程序无法启动
你正在构建中,一些 Makefile 会这样做:(

cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1

由 X 的旧 Imake makefile 生成器构建的 Makefile 通常会执行此操作。)

-o is the name of the file that will be written to disk by the compiler

-h is the name that will be recorded in ELF binaries that link against this file.

One common use is to provide library minor version numbers. For instance, if
you're creating the shared library libfoo, you might do:

cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1

Then if you compile your hello world app and link against it with

cc -o hello -lfoo

the elf binary for hello will record a NEEDED entry for libfoo.so.1 (which you can
see by running elfdump -d hello ).

Then when you need to add new functions later, you could change the -o value to
libfoo.so.1.1 but leave the -h at libfoo.so.1 - all the programs you already built
with 1.0 still try to load libfoo.so.1 at runtime, so continue to work without being
rebuilt, but you'll see via ls that it's 1.1.

This is also sometimes used when building libraries in the same directory they're
used at runtime, if you don't have a separate installation directory or install
via a packaging system. To avoid crashing programs that are running when you
overwrite the library binary, and to avoid programs not being able to start when
you're in the middle of building, some Makefiles will do:

cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1

(Makefiles built by the old Imake makefile generator from X commonly do this.)

蒗幽 2024-08-22 03:03:26

他们指的是不同的名字。具体来说,-o 选项是文件的实际名称 - 文件系统上的名称。 -h 选项设置最终目标文件中的内部 DT_SONAME。这是其他模块在内部引用共享对象的名称。我相信当您在链接到它的对象上运行 ldd 时,您也会看到这个名称。

They are referring to different names. Specifically, the -o option is the file's actual name - the one on the filesystem. The -h option sets the internal DT_SONAME in the final object file. This is the name by which the shared object is referenced internally by other modules. I believe it's the name that you also see when you run ldd on objects that link to it.

烟柳画桥 2024-08-22 03:03:26

-o 选项将为输出文件命名,而 -h 选项将在库内设置内部名称。当动态加载器使用时,此内在名称优先于文件名,并允许它使用预定义的规则来查看正确的库。

您可以使用该命令查看给定库中记录的内部名称:

elfdump -d xxx.so | grep SONAME

查看此处了解详细信息:

http:// /docs.oracle.com/cd/E23824_01/html/819-0690/chapter4-97194.html

The -o option will name the output file while the -h option will set an intrinsic name inside the library. This intrinsic name has precedence over the file name when used by the dynamic loader and allows it to use predefined rules to peek the right library.

You can see what intrinsic name was recorded into a given library with that command:

elfdump -d xxx.so | grep SONAME

Have a look here for details:

http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter4-97194.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文