나는 arm용 util-linux를 크로스 컴파일하려고 시도했지만 항상 동적으로 링크된 실행 파일을 얻었는데 왜 이런 일이 발생하는지 모르겠습니다. 내 목표는 정적입니다. 비슷한 단계로 다른 도구를 사용하기 전에 크로스 컴파일을 해봤는데 항상 작동했기 때문에 이번에는 내가 뭘 잘못하고 있는지 모르겠습니다. 우분투 16.04를 사용하고 있습니다. 내가 실행하는 명령은 다음과 같습니다.
export CC=arm-linux-gnueabi-gcc
export ac_cs_linux_vers=4
export CFLAGS=-static
export CPPFLAGS=-static
export LDFLAGS=-static
./configure --host=arm-linux LDFLAGS=-static --disable-shared --without-tinfo --without-ncurses --disable-ipv6 --disable-pylibmount --enable-static-programs=fdisk,sfdisk,whereis --prefix=/opt/util-linux/arm --bindir=/opt/util-linux/arm/bin --sbindir=/opt/util-linux/arm/sbin
보시다시피, 저는 제가 생각할 수 있는 모든 곳에 static을 지정했고 "단지 그것이 저를 이해했는지 확인하기 위해" 반복하기도 했습니다. 그리고 구성 스크립트를 실행한 후의 출력은 다음과 같습니다.
util-linux 2.28.2
prefix: /opt/util-linux/arm
exec prefix: ${prefix}
localstatedir: ${prefix}/var
bindir: /opt/util-linux/arm/bin
sbindir: /opt/util-linux/arm/sbin
libdir: ${exec_prefix}/lib
includedir: ${prefix}/include
usrbin_execdir: ${exec_prefix}/bin
usrsbin_execdir: ${exec_prefix}/sbin
usrlib_execdir: ${exec_prefix}/lib
compiler: arm-linux-gnueabi-gcc
cflags: -static
suid cflags:
ldflags: -static
suid ldflags:
Python: /usr/bin/python
Python version: 2.7
Python libs: ${exec_prefix}/lib/python2.7/site-packages
Bash completions: /usr/share/bash-completion/completions
Systemd support: no
Btrfs support: yes
warnings:
그런 다음 이렇게 합니다.
make fdisk
또는
make whereis
편집이 완료되면 다음을 수행합니다.
file fdisk
디스크 드라이브방금 생성된 파일이며 다음과 같습니다.
fdisk: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=369363ef8f8173a3a1c2edc178eb77255a2dc415, not stripped
보시다시피 "동적 연결"이라고 표시되어 있습니다. 인터넷에서 검색해봤지만 답을 찾을 수 없었습니다. 나는 또한 이것을 한다:
./configure --host=arm-linux LDFLAGS=-static --disable-shared --without-tinfo --without-ncurses --disable-ipv6 --disable-pylibmount --prefix=/opt/util-linux/arm --bindir=/opt/util-linux/arm/bin --sbindir=/opt/util-linux/arm/sbin
이는 기본적으로 모든 것을 정적으로 컴파일해야 하는 "--enable-static-programs" 매개변수가 없다는 점을 제외하면 이전 구성 명령과 정확히 동일하지만 그렇지 않습니다.
내가 뭔가 잘못하고 있는 걸까요, 아니면 Makefile 버그인가요?
답변1
내 질문에 게시된 원래 명령이 정적 파일을 생성하지 않는 이유를 방금 알아냈습니다! 나는 달려야 한다LDFLAGS="--static으로 설정". 이 작업을 수행한 후 모든 것이 정적으로 연결되었습니다!
반복하기 위해 다음을 실행했습니다.
export CC=arm-linux-gnueabi-gcc
export ac_cs_linux_vers=4
export CFLAGS=-static
export SUID_CFLAGS=-static
export SUID_LDFLAGS=-static
export CPPFLAGS=-static
export LDFLAGS=-static
그 다음에
./configure --host=arm-linux-gnueabi --disable-shared --without-tinfo --without-ncurses --disable-ipv6 --disable-pylibmount --prefix=/opt/util-linux/arm --bindir=/opt/util-linux/arm/bin --sbindir=/opt/util-linux/arm/sbin
그런 다음
make LDFLAGS="--static"
모든 것이 정적으로 연결되어 있습니다! 이전 답변에서 알 수 있듯이 개체 파일 수집은 더 이상 필요하지 않지만 대안으로 사용할 수도 있습니다.
또한 참고용으로 여러분 중 일부가 걱정할 수 있는 내 버전 정보는 다음과 같습니다.
$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ arm-linux-androideabi-ld --version
GNU gold (GNU Binutils 2.25.90.20151125) 1.11
Copyright (C) 2015 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
답변2
정적 바이너리는 .static
빌드 후 확장을 사용하여 빌드됩니다.
$ file fdisk.static
fdisk.static: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=b51ec4b17f772b881d2a1eaefd368cfb96d0db12, not stripped
난 이것밖에 못받았어
./configure --host=arm-linux-gnueabihf --enable-static-programs=fdisk
(어떤 변수도 필요하지 않습니다 FLAGS
. 설정에서 로 바꾸세요 gnueabihf
. 이미 작동 중인 크로스 컴파일 설정이 있었기 때문에 그냥 사용했습니다.)gnueabi
armhf
답변3
업데이트 - 아래의 다른 답변을 참조하세요
좋아, util-linux의 구성 스크립트로 생성된 Makefile과 다른 유틸리티로 생성된 또 다른 Makefile(결국 정적으로 링크된 파일이 생성됨)을 분석한 후(문자 그대로) 몇 시간 후에 전달된 매개변수를 성공적으로 검색했습니다.ARM-Linux-gnueabi-gcc정적 링크 파일을 생성합니다. 그래서 나는 이것으로 끝났습니다.
arm-linux-gnueabi-gcc -ffloat-store -static -DHAVE_CONFIG_H -static -D_U_="__attribute__((unused))" -o <name_of_your_file> <object files produced by the compiler separated by space>
그래서 컴파일 후어디:
make whereis
그런 다음 생성된 모든 개체 파일을 검색했습니다.
find . -name "*.o"
나는 결국 :
./misc-utils/whereis.o
./lib/libcommon_la-blkdev.o
./lib/libcommon_la-sysfs.o
./lib/libcommon_la-idcache.o
./lib/libcommon_la-procutils.o
./lib/libcommon_la-mbsalign.o
./lib/libcommon_la-linux_version.o
./lib/libcommon_la-env.o
./lib/libcommon_la-pager.o
./lib/libcommon_la-strutils.o
./lib/libcommon_la-mangle.o
./lib/libcommon_la-timeutils.o
./lib/libcommon_la-fileutils.o
./lib/libcommon_la-exec_shell.o
./lib/libcommon_la-match.o
./lib/libcommon_la-crc32.o
./lib/libcommon_la-md5.o
./lib/libcommon_la-randutils.o
./lib/libcommon_la-ttyutils.o
./lib/libcommon_la-cpuset.o
./lib/libcommon_la-color-names.o
./lib/libcommon_la-ismounted.o
./lib/libcommon_la-path.o
./lib/libcommon_la-canonicalize.o
./lib/libcommon_la-loopdev.o
./lib/libcommon_la-setproctitle.o
./lib/libcommon_la-strv.o
그런 다음 이 모든 개체 파일을 한 줄로 병합하고 다른 명령을 실행합니다.
arm-linux-gnueabi-gcc -ffloat-store -static -DHAVE_CONFIG_H -static -D_U_="__attribute__((unused))" -o mywhereis ./misc-utils/whereis.o ./lib/libcommon_la-blkdev.o ./lib/libcommon_la-sysfs.o ./lib/libcommon_la-idcache.o ./lib/libcommon_la-procutils.o ./lib/libcommon_la-mbsalign.o ./lib/libcommon_la-linux_version.o ./lib/libcommon_la-env.o ./lib/libcommon_la-pager.o ./lib/libcommon_la-strutils.o ./lib/libcommon_la-mangle.o ./lib/libcommon_la-timeutils.o ./lib/libcommon_la-fileutils.o ./lib/libcommon_la-exec_shell.o ./lib/libcommon_la-match.o ./lib/libcommon_la-crc32.o ./lib/libcommon_la-md5.o ./lib/libcommon_la-randutils.o ./lib/libcommon_la-ttyutils.o ./lib/libcommon_la-cpuset.o ./lib/libcommon_la-color-names.o ./lib/libcommon_la-ismounted.o ./lib/libcommon_la-path.o ./lib/libcommon_la-canonicalize.o ./lib/libcommon_la-loopdev.o ./lib/libcommon_la-setproctitle.o ./lib/libcommon_la-strv.o
바라보다! :) mywhere가 생성되었습니다.
따라서 file 명령을 실행하여 공로를 인정합니다.
mywhereis: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=a5b7c4ad147dc26ed211a7aa643f744a29e477f3, not stripped
정말 편안해요! ! 글쎄, 이 솔루션은 이상적이지 않습니다하지만작업이 완료되고 단순화됩니다!
나는 이 문제를 조사하고 실험하는 데 총 8시간을 보냈고 아마도 "일률적인" 접근 방식은 없다는 것을 깨달았습니다. 그러나 이 방법으로 작업이 완료되었습니다! 내 Android 휴대폰에서 파일을 테스트했는데 제대로 작동했습니다!
또한 이 솔루션은 개체 파일을 연결하여 정적으로 링크된 파일을 생성하므로 "설정하고 잊어버리는" 방법인 것 같습니다. 완전히 다른 소스 패키지의 다른 유틸리티를 사용하여 이것을 테스트했는데 그것도 작동했습니다.
답변4
나는 전체 프로그램 세트를 정적으로 연결하려고 몇 시간을 보냈고 이 방법으로 생성할 수 있는 프로그램은 몇 개밖에 되지 않았습니다.
에서 configure.h
:
--enable-static-programs=LIST
link static the programs in LIST (comma-separated,
supported for losetup, mount, umount, fdisk, sfdisk,
blkid, nsenter, unshare)
정적 연결이 필요한데 lsblk
목록에 추가해도 작동하지 않습니다(다른 사람들은 이렇게 합니다). 이 목록 외부의 다른 정적 버전을 얻을 수 있는 방법이 있습니까?