如题。Linux下交叉编译ntp源码,最终编译出的ntpd为shared object,为嘛不应该是executable object文件。
ntpd: ELF 32-bit LSB  shared object, ARM, EABI4 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, not stripped

解决方案 »

  1.   

    最近一直在搞这个编译,gcc编译器用的4.2.0,交叉编译旧版本的ntp源码是编译成executable的,新版ntp源码编译完后成了shared object,放到开发板上后运行出现段错误。编译器没变,只是源码有升级。后来也找了很多的相关解释,有说是生成shared object是因为有pie和pic编译选项造成的。现在问题比较混乱,不知道是gcc编译选项问题,还是我新版ntp源码问题,比较纠结。
      

  2.   

    着你这么说应该是你的高版本源码出现了问题,肯呢是高版本的源码makefile.in有改动吧,你可以看看
      

  3.   

    应该不是Makefile.in的问题,我比对了新旧两个版本,都是小的改动,而且我用旧版Makefile.in编译新的源码,问题仍旧存在。但我发现有个区别,configure时,新旧版产生的信息不一致。新版里面增加了pie选项,而旧版里面没有,我在网上也查了pie选项可以使executable程序编译成shared格式,现在的问题是,我们如何去掉此pie选项?如下是配置信息里面截取出来的。
    configure: running /bin/bash ./configure --disable-option-checking '--prefix=/home/lhq/ntpcmd'  'LEP_LDFLAGS=-pie -Wl,-z,relro -Wl,-z,now' 'LEP_CPPFLAGS=-D_FORTIFY_SOURCE=2' 'LEP_CFLAGS=-fPIE -fPIC -fstack-protector-all -O1' '--enable-function-sections' '--enable-silent-rules' '--disable-libevent-install' '--disable-libevent-regress' '--disable-shared' '--disable-openssl' 'CC=/opt/arm-2007q1/bin/arm-none-linux-gnueabi-gcc' '--host=arm-none-linux-gnueabi' '--with-yielding-select=yes' 'host_alias=arm-none-linux-gnueabi' --cache-file=/dev/null --srcdir=.
      

  4.   

    看 link 时是否开启了 -r, -i, --relocatable 选项
      

  5.   

    试了用 -pie 的确会生成 shared object,正常应该不影响使用的才对……
      

  6.   

    修改configure.ac这个文件是编译检查选项