回复: 【转载】C/C++ 编译器和调试器以及静态库、动态库使用汇总
#6 [ppking 08-24 10:41]
**********************动态载入过程***************
Linux有共享程式库,如果之前你已坐著读完上一章节,想必现在一听到像这样的说词,便会立刻感到头昏。有一些照惯例而言是在连结时期便该完成的工作,必须延迟到载入时期才能完成。 7.2 错误讯息
把你连结的错误寄给我!我不会做任何的事,不过我可以把它们写起来**
can't load library: /lib/libxxx.so, Incompatible version
(a. out only) 这是指你没有xxx程式库的正确的主要版本。可别以为随随 便便弄个连结到你目前拥有的版本就可以了,如果幸运的话,就只会造成你的程式分页错误而已。去抓新的版本.ELF类似的情况会造成像下面这样的讯息:
ftp: can't load library 'libreadline.so.2'
warning using incompatible library version xxx
(a. out only)你的程式库的次要版本比起这支程式用来编译的还要旧。程式依然可以执行。只是可能啦!我想,升个级应该没什麽伤害吧!
7.3 控制动态载入器的运作
有一组环境变数会让动态载入器有所反应。大部份的环境变数对ldd的用途要比起对一般users的还要来得更多。而且可以很方便的设定成由ldd配合各种参数来执行。这些变数包括,
LD_BIND_NOW --- 正常来讲,函数在呼叫之前是不会让程式寻找的。设定这个旗号会使得程式库一载入,所有的寻找便会发生,同时也造成起始的时间较慢。当你想测试程式,确定所有的连结都没有问题时,这项旗号就变得很有用。 LD_PRELOAD可以设定一个档案,使其具有*覆盖*函数定义的能力。例如,如果你要测试记忆体分配的方略,而且还想置换*malloc*,那麽你可以写好准备替换的副程式,并把它编译成mallolc.,然後: $ LD_PRELOAD=malloc.o; export LD_PRELOAD $ some_test_program LD_ELF_PRELOAD 与 LD_AOUT_PRELOAD 很类似,但是仅适用於正确的二进位型态。如果设定了 LD_something_PRELOAD 与 LD_PRELOAD ,比较明确的那一个会被用到。 LD_LIBRARY_PATH是一连串以分号隔离的目录名称,用来搜寻共享程式库。对ld而言,并没有任何的影响;这项只有在执行期间才有影响。另外,对执行setuid与setgid的程式而言,这一项是无效的。而LD_ELF_LIBRARY_PATH与LD_AOUT_LIBRARY_PATH这两种旗号可根据各别的二进位型式分别导向不同的搜寻路径。一般正常的运作下,不应该会用到LD_LIBRARY_PATH;把需要搜寻的目录加到/etc/ld.so.conf/里;然後重新执行ldconfig。 LD_NOWARN 仅适用於a. ..
#7 [ppking 08-24 10:43]
呵呵,Ctrl cCtrl v
#8 [pinkscut 03-13 22:38]
谢谢楼主,正想找这方面的资料