Closed pexcn closed 5 years ago
readme 中的这种编译方式其实和静态编译差不多,不推荐“全静态连接”,glibc某些函数如果静态链接,运行时会有问题。上面其实可以看到一些 gcc 的警告信息,说的就是这种情况。
如果你希望将 libuv 依赖库静态链接到 dns2tcp 可执行文件中,可按照如下步骤进行编译:
# 进入某个目录 cd /opt
libuv_version="1.31.0" wget https://github.com/libuv/libuv/archive/v$libuv_version.tar.gz -Olibuv-$libuv_version.tar.gz tar xvf libuv-$libuv_version.tar.gz
cd libuv-$libuv_version ./autogen.sh ./configure --prefix=/opt/libuv --enable-shared=no --enable-static=yes CC="gcc -O3" make && sudo make install cd ..
git clone https://github.com/zfl9/dns2tcp
cd dns2tcp make CFLAGS="-pthread" INCLUDES="-I/opt/libuv/include" LDFLAGS="-L/opt/libuv/lib" && sudo make install
嗯嗯,其实我是想把它移植到 openwrt 里面,静态编译就可以少安装一个 libuv 的包了
按照这个方式编译其实就不需要 libuv 相关的东西了。
注意字眼:将 libuv 依赖库静态链接到 dns2tcp 可执行文件中。
这是仅静态链接 libuv ,嗯嗯大概懂了~
通常我个人喜欢的做法是,第三方依赖,静态链接进去,glibc 还是不要静态链接了。
这是仅静态链接 libuv ,嗯嗯大概懂了~
但这就够了(99%的情况下都没问题的)。直接拷贝 binary 文件到目标主机上运行即可。
如果静态链接了 glibc,假如用 openwrt-18.06 的 sdk 编译运行正常,然后到了 openwrt-19.07 的环境下运行就会可能出错?
具体不是太了解,比如 getaddrinfo() 这个解析域名的 api,如果静态链接进去了,编译时只是一个警告,但是运行的时候,会出现段错误。类似的例子应该挺多的。
嗯,好的
这是使用readme的方式静态编译的 dns2tcp:
$ file dns2tcp
dns2tcp: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=53737165ba201d8624f3d38b3b3bdceab76e15d6, for GNU/Linux 3.2.0, stripped
$ ldd dns2tcp
linux-vdso.so.1 (0x00007ffdacc66000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f40c3c14000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f40c3a51000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f40c3c70000)
可以看到就只有 pthread、libc 两个动态链接库,所以没有问题的。我将它拷贝到其它linux x86上照常运行。当然 openwrt 也是同样的道理,我自己也是将这些运行在树莓派上的,也是交叉编译过去的。
嗯,清楚了,只是 openwrt 的 Makefile 我还不知道应该怎么写... 😄
比如:
make STATIC=1
, 我试了一下这样改是可以静态链接的