看了一点链接和装载的内容,很迷惑: 程序启动的时候需要操作系统通过ld程序去加载它,而这个加载过程本身是ld.so.2完成的。 我就奇怪了: 程序在运行时如何链接并启动,是通过一个动态链接库完成的。那么这个ld.so.2又是通过本身去完成链接的吗? 逻辑上岂不是死循环--自己要调用自己?
想了解,如果-lm 命令的时候,同时有libm.a和libm.so的话,实际上用哪个?
我在solaris上面做的试验,如果两个同时存在,则选择libm.so。如果只有libm.a那么-lm就是链接libm.a
问题: 所有平台都是这样的么? 还是和我的具体使用的编译器或者是场景有关? 谢谢!
实验如下
-------------------------------------------------------------------------
> cat n.c
#include
拿来别人的一个包在我们的aix5上configure然后make 信息如下 if /bin/sh ../../libtool --mode=compile /usr/bin/g++ -DHAVE_CONFIG_H -I. -I. -I../.. -I../../include -I ../../../c/include -g -O2 -MT libsysutils___la-sys_utils.lo -MD -MP -MF ".deps/libsysutils___la-sys_utils.Tpo" -c -o libsysutils___la-sys_utils.lo `test -f 'sys_utils.cc' || echo './'`sys_utils.cc; then mv -f ".deps/libsysutils...
用ld 链接时出现的问题 好怪啊,我的AT&T汇编的hello world [code].data msg: .ascii "Hello, world!\n" # our dear string len = . - msg # length of our dear string .text # .globl print_str # .def print_str; .scl 1; .type 32; .endef print_str: pushl %edx movl $len,%edx # third argument: message length(15) movl $msg,%ecx # second argu...
整个工程包括几个函数文件和一个主文件 函数文件编译产生一个静态链接库和一个动态链接库 主程序使用dlopen动态调用动态库中的函数 当动态链接库中的函数不调用静态库中的函数时,程序没有问题,否则,dlopen就会报错,返回ENOEXEC。但也不总是出现这中情况,怀疑是ld编译动态链接库是不是有什么限制。 程序大体结构如下: [code] /*once.c*/ once(char *str) { printf("once.c print [%s]\n",str); } /*twice.c*/ twice(...
整个工程包括几个函数文件和一个主文件 函数文件编译产生一个静态链接库和一个动态链接库 主程序使用dlopen动态调用动态库中的函数 当动态链接库中的函数不调用静态库中的函数时,程序没有问题,否则,dlopen就会报错,返回ENOEXEC。但也不总是出现这中情况,怀疑是ld编译动态链接库是不是有什么限制。 程序大体结构如下: [code] /*once.c*/ once(char *str) { printf("once.c print [%s]\n",str); } /*twice.c*/ twice(...
我有一个普通的c文件helloworld
>cat f.c
#include