cross-compile-curl

curl, wget


更新記錄

item note
20151109 第一版

目錄


curl , wget 說明

  • wget

    • GNU Wget is a free software package for retrieving files using HTTP, HTTPS and FTP, the most widely-used Internet protocols
    • wget 只支援下載(using HTTP, HTTPS and FTP)且無法上傳資料
  • curl

    • curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP)
    • curl is used in command lines or scripts to transfer dat
    • curl支援上傳及下載
  • 兩者差異

    • library. curl is powered by libcurl - a cross-platform library with a stable API that can be used by each and everyone.
    • Wget is command line only. There’s no library.
    • HTTP auth. curl supports more HTTP authentication methods, especially over HTTP proxies: Basic, Digest, NTLM and Negotiate
    • Wget supports only Basic auth as the only auth type over HTTP proxy

使用範例

1
-T, --upload-file <file>
1
curl -T "img[1-1000].png" ftp://ftp.picturemania.com/upload/

curl cross compile 不包含ssl及zlib

1
wget http://curl.haxx.se/download/curl-7.37.1.tar.gz
  • 設定環境

    make

    make install

1
2
3
4
5
6
7
8
export CROSS_COMPILE="arm-hisiv200-linux"
export AR=${CROSS_COMPILE}-ar
export AS=${CROSS_COMPILE}-as
export LD=${CROSS_COMPILE}-ld
export RANLIB=${CROSS_COMPILE}-ranlib
export CC=${CROSS_COMPILE}-gcc
export NM=${CROSS_COMPILE}-nm
./configure --prefix=/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build --target=${CROSS_COMPILE} --host=${CROSS_COMPILE} --build=i586-pc-linux-gnu
  • 產生bin及so如下

curl 為119Kbyte

libcurl.so.4.3.0 為354Kbyte

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build# tree -L 3
.
├── bin
│   ├── curl
│   └── curl-config
├── include
│   └── curl
│   ├── curlbuild.h
│   ├── curl.h
│   ├── curlrules.h
│   ├── curlver.h
│   ├── easy.h
│   ├── mprintf.h
│   ├── multi.h
│   ├── stdcheaders.h
│   └── typecheck-gcc.h
├── lib
│   ├── libcurl.a
│   ├── libcurl.la
│   ├── libcurl.so -> libcurl.so.4.3.0
│   ├── libcurl.so.4 -> libcurl.so.4.3.0
│   ├── libcurl.so.4.3.0
│   └── pkgconfig
1
2
3
4
root@d293138e4faa:/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build# ls -lh bin/curl
-rwxr-xr-x 1 root root 119K Nov 9 06:59 bin/curl
root@d293138e4faa:/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build# ls -lh lib/libcurl.so.4.3.0
-rwxr-xr-x 1 root root 354K Nov 9 06:59 lib/libcurl.so.4.3.0

curl cross compile 包含ssl及zlib

cross compile openssl

參考 How To Build OpenSSL for ARM

1
2
3
4
5
6
wget http://www.linuxfromscratch.org/patches/downloads/openssl/openssl-1.0.1e-fix_parallel_build-1.patch
wget http://www.linuxfromscratch.org/patches/downloads/openssl/openssl-1.0.1e-fix_pod_syntax-1.patch

cd openssl-1.0.1e/
patch -Np1 -i ../openssl-1.0.1e-fix_parallel_build-1.patch
patch -Np1 -i ../openssl-1.0.1e-fix_pod_syntax-1.patch
  • 環境設定如下
1
2
3
4
5
6
7
8
export INSTALLDIR=/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/openssl/final
export TARGETMACH=arm-hisiv200-linux
export BUILDMACH=i686-pc-linux-gnu
export CROSS=arm-hisiv200-linux
export CC=${CROSS}-gcc
export LD=${CROSS}-ld
export AS=${CROSS}-as
export AR=${CROSS}-ar
  • configure
1
2
3
4
5
./Configure -DOPENSSL_NO_HEARTBEATS --openssldir=/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/openssl/final shared os/compiler:arm-hisiv200-linux-

make

make install
  • 手動制作.so
1
2
3
4
5
6
7
$ cd ../../final/lib/
$ $AR -x libcrypto.a
$ $CC -shared *.o -o libcrypto.so
$ rm *.o
$ $AR -x libssl.a
$ $CC -shared *.o -o libssl.so
$ rm *.o
  • 產生結果如下

openssl 為 3Mbyte

libssl.so 為522K

libcrypto.so為 2.5M

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
root@d293138e4faa:/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/openssl/final# tree -L 2
.
├── bin
│   ├── c_rehash
│   └── openssl
├── certs
├── include
│   └── openssl
├── lib
│   ├── engines
│   ├── libcrypto.a
│   ├── libcrypto.so
│   ├── libssl.a
│   ├── libssl.so
│   └── pkgconfig

xxx

root@d293138e4faa:/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/openssl/final# ls -lh bin/openssl
-rwxr-xr-x 1 root root 3.0M Nov 9 07:52 bin/openssl
root@d293138e4faa:/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/openssl/final# ls -lh lib/libssl.so
-rwxr-xr-x 1 root root 522K Nov 9 08:05 lib/libssl.so
root@d293138e4faa:/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/openssl/final# ls -lh lib/libcrypto.so
-rwxr-xr-x 1 root root 2.5M Nov 9 08:04 lib/libcrypto.so
r

zlib compile openssl

參考How To Build zlib for ARM

1
2
3
4
5
6
7
export INSTALLDIR=/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/zlib-test/build/final
export TARGETMACH=arm-hisiv200-linux
export BUILDMACH=i686-pc-linux-gnu
export CROSS=arm-hisiv200-linux
export CC=${CROSS}-gcc
export LD=${CROSS}-ld
export AS=${CROSS}-as
  • configure & make
1
2
3
4
5
./configure --prefix=/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/zlib-test/build/final

make

make install
  • 產生結果如下
1
2
3
4
5
6
7
8
9
10
11
root@d293138e4faa:/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/zlib-test/build/final# tree -L 2
.
├── include
│   ├── zconf.h
│   └── zlib.h
├── lib
│   ├── libz.a
│   ├── libz.so -> libz.so.1.2.8
│   ├── libz.so.1 -> libz.so.1.2.8
│   ├── libz.so.1.2.8

curl compile openssl 開啟ssl及zlib

  • 先設定prebuild final目錄如下(將剛剛產生的.so及.h)整理如下

build-curl-ssl/openssl/include/openssl放置openssl的include檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
root@d293138e4faa:/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build-curl-ssl# tree -L 3

.
├── openssl
│   ├── apps
│   │   └── openssl
│   ├── include
│   │   └── openssl
│   └── libs
│   ├── libcrypto.so
│   ├── libcrypto.so-org
│   ├── libopenssl.so
│   └── libssl.so
└── zlib
├── include
│   ├── zconf.h
│   └── zlib.h
└── libs
├── libz.a
├── libz.so
├── libz.so.1 -> ./libz.so
└── libz.so.1.2.8 -> ./libz.so.1
  • copmile環境設定如下
1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh

export CROSS_COMPILE="arm-hisiv200-linux"
export CPPFLAGS="-I/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build-curl-ssl/openssl/include -I/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build-curl-ssl/zlib/include"
export LDFLAGS="-L/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build-curl-ssl/openssl/libs -L/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build-curl-ssl/zlib/libs"
export AR=${CROSS_COMPILE}-ar
export AS=${CROSS_COMPILE}-as
export CC=${CROSS_COMPILE}-gcc
export LD=${CROSS_COMPILE}-ld
export NM=${CROSS_COMPILE}-nm
export LIBS="-lssl -lcrypto"
  • configure & make
1
2
3
4
5
./configure  --prefix=/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build-curl-ssl --target=${CROSS_COMPILE}  --host=${CROSS_COMPILE} --build=i586-pc-linux-gnu  --with-ssl --with-zlib

make

make install
  • 產生結果如下:

curl 為 119K

libcurl.so.4.3.0為 413K

與原本的大小差不多,但需要ssl、cypto及zlib的lib (至少要3Mbyte)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.
├── bin
│   ├── curl
│   └── curl-config
├── include
│   └── curl
│   ├── curlbuild.h
│   ├── curl.h
│   ├── curlrules.h
│   ├── curlver.h
│   ├── easy.h
│   ├── mprintf.h
│   ├── multi.h
│   ├── stdcheaders.h
│   └── typecheck-gcc.h
├── lib
│   ├── libcurl.a
│   ├── libcurl.la
│   ├── libcurl.so -> libcurl.so.4.3.0
│   ├── libcurl.so.4 -> libcurl.so.4.3.0
│   ├── libcurl.so.4.3.0
│   └── pkgconfig
│   └── libcurl.pc


root@d293138e4faa:/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build-curl-ssl# ls -lh bin/curl
-rwxr-xr-x 1 root root 119K Nov 9 08:45 bin/curl
root@d293138e4faa:/opt/DOCKER-erwin-build-hiv200/work/cross-compile/curl/build-curl-ssl# ls -lh lib/libcurl.so.4.3.0
-rwxr-xr-x 1 root root 413K Nov 9 08:45 lib/libcurl.so.4.3.0

參考資料