我有一个使用uclibc在MIPSCPU上运行的多进程程序,它是用gcc4.5.3编译的。其中一个过程(名称为“tv”)需要链接到一个共享库(libtest.so),该库也是我编写的。“tv”进程是用C++编写的,而libtest.so是用C编写的。我还从libtest.so转储了elfheader,它同时设置了PIC和CPIcflags,所以我认为创建库是可以的。当我尝试运行该程序时,除“tv”进程外,所有进程都正常启动。没有错误信息。当我使用ps检查它的状态时,它已经变成了一个僵尸进程。我试过以下方法如果我从链接进程中删除libtest.so,并删除对libtest.so的所有引用
我们有一个链接多个静态库的程序,这些静态库可能会或可能不会定义一些符号,具体取决于编译选项。在OSX上,我们使用带有NULL句柄的dlsym(3)来获取符号地址。然而,在Linux上,dlsym(3)总是返回NULL。考虑一个简单的程序(下面的源代码)链接到一个包含一个函数和一个变量的静态库中,并尝试打印它们的地址。我们可以检查程序是否包含符号:$nm-Ctest|grep"test\(func\|var\)"0000000000400715TtestFunc0000000000601050BtestVar但是程序运行时,两者都找不到:$./testtestVar:(nil)testF
我们有一个链接多个静态库的程序,这些静态库可能会或可能不会定义一些符号,具体取决于编译选项。在OSX上,我们使用带有NULL句柄的dlsym(3)来获取符号地址。然而,在Linux上,dlsym(3)总是返回NULL。考虑一个简单的程序(下面的源代码)链接到一个包含一个函数和一个变量的静态库中,并尝试打印它们的地址。我们可以检查程序是否包含符号:$nm-Ctest|grep"test\(func\|var\)"0000000000400715TtestFunc0000000000601050BtestVar但是程序运行时,两者都找不到:$./testtestVar:(nil)testF
在osx加载器上,@loader_path解析为通用二进制对象的位置,@executable_path解析为可执行文件的位置。在Linux上,显然只有$ORIGIN,它解析为可执行文件路径。linux加载器中是否有一个隐藏的功能来指定通用ELF对象的动态搜索路径?或者$ORIGIN对so对象的行为可能不同?Linux也有$LIB和$PLATFORM,但它们没有提供我需要的东西。 最佳答案 $ORIGIN是被加载对象的位置,所以在可执行文件和可执行文件加载的共享库中是不同的。编辑:这是我执行的一个小测试:~$mkdir/tmp/tes
在osx加载器上,@loader_path解析为通用二进制对象的位置,@executable_path解析为可执行文件的位置。在Linux上,显然只有$ORIGIN,它解析为可执行文件路径。linux加载器中是否有一个隐藏的功能来指定通用ELF对象的动态搜索路径?或者$ORIGIN对so对象的行为可能不同?Linux也有$LIB和$PLATFORM,但它们没有提供我需要的东西。 最佳答案 $ORIGIN是被加载对象的位置,所以在可执行文件和可执行文件加载的共享库中是不同的。编辑:这是我执行的一个小测试:~$mkdir/tmp/tes
是否可以让一个linux库(例如“libloader.so”)加载另一个库来解析任何外部符号?我有一大堆代码有条件地编译以支持SIMD级别(SSE2、AVX、AVX2)。如果构建平台与运行时平台相同,则此方法工作正常。但它阻碍了跨不同处理器代的重用。一种想法是将调用function的executable链接到不直接实现function的libloader.so>。相反,它解析(绑定(bind)?)来自另一个加载库的符号,例如libimpl_sse2.so、libimpl_avx2.so等取决于cpuflags。有数百个函数需要以这种方式动态绑定(bind),因此更改声明或调用代码是不切
是否可以让一个linux库(例如“libloader.so”)加载另一个库来解析任何外部符号?我有一大堆代码有条件地编译以支持SIMD级别(SSE2、AVX、AVX2)。如果构建平台与运行时平台相同,则此方法工作正常。但它阻碍了跨不同处理器代的重用。一种想法是将调用function的executable链接到不直接实现function的libloader.so>。相反,它解析(绑定(bind)?)来自另一个加载库的符号,例如libimpl_sse2.so、libimpl_avx2.so等取决于cpuflags。有数百个函数需要以这种方式动态绑定(bind),因此更改声明或调用代码是不切
这是来自Linux编程书的引述:%gcc-oappapp.o-L.–ltest假设libtest.a和libtest.so可用。那么链接器必须选择其中一个库而不是另一个。链接器搜索每个目录(首先用-L指定的那些选项,然后是标准目录中的选项)。当链接器找到包含libtest.a的目录或libtest.so,链接器停止搜索目录。如果目录中只有两个变体之一,则链接器选择该变体。否则,链接器选择共享库版本,除非否则您明确指示它。您可以使用-static要求静态的选项文件。例如,以下行将使用libtest.a存档,即使libtest.so共享库也可用:%gcc-static-oappapp.o-
这是来自Linux编程书的引述:%gcc-oappapp.o-L.–ltest假设libtest.a和libtest.so可用。那么链接器必须选择其中一个库而不是另一个。链接器搜索每个目录(首先用-L指定的那些选项,然后是标准目录中的选项)。当链接器找到包含libtest.a的目录或libtest.so,链接器停止搜索目录。如果目录中只有两个变体之一,则链接器选择该变体。否则,链接器选择共享库版本,除非否则您明确指示它。您可以使用-static要求静态的选项文件。例如,以下行将使用libtest.a存档,即使libtest.so共享库也可用:%gcc-static-oappapp.o-
假设我们有一个名为libtest.so的共享库,其中有一个函数“foo”使用strip丢弃libtest.so中的所有符号$striplibtest.so所以,现在如果我们使用:$nmlibtest.so它会打印出来:nm:libtest.so:无符号但如果我们使用:$readelf-slibtest.sofoo函数仍然可以从其结果中看出:...10:000005dc5FUNC全局默认值12_Z3foov...我们也可以使用命令字符串来检查它:$stringslibtest.so..._Z3foov...这是我的问题,为什么nm没有给出strip化libtest.so的结果?谢谢