ADVANCED: do_package

markyang92·2022년 11월 30일
0

yocto

목록 보기
47/53
  • 유명한 컴포넌트인 pciutilsyocto에서 패키징을 어떻게 하는가를 본다.

ipk化

0. make install (do_install())

  • 설치된 파일들은 Yocto에서 ${D}=${WORKDIR}/image 변수에 담는다.

1. ${D} -> package

  • 이제 ${D}=${WORKDIR}/image에 있는 것을 패키징을 하기위해, strip도하고 debug 파일도 만들고.. 할 것이다.
    우선 ${D} -> package로 copy한다.

2. split_and_strip_files

  • do_package.bbclass
  • 우선 package 디렉토리에서, ELF 파일을 찾아야한다.
    • ELF 포맷을 봐야 strip 도 하고 debug 파일도 만들기 때문이다.
    • 주의할 점은 이미 debug용 파일은 건들지 않는다.

debug 용은 알아내 거르기 'PACKAGE_DEBUG_SPLIT_STYLE'

  • yocto에서 해당 경로 혹은 파일이 debug용인가에 대해 알아내기 위해 다음과 같은 변수를 둔다.
    PACKAGE_DEBUG_SPLIT_STYLE 에 대한 내용은 링크를 통해 알아내자.
  • yocto 레시피에서 따로 지정하지 않았다면, 제일 아래 내용이 debug_vars (dict) 형태로 return 된다.
    그래서 package 디렉토리를 탐색하다가 아래와 같은 필터로 디버그용 파일/디렉토리는 ELF 찾기에서 뺀다.

static library 면 거르기

  • static library는 검출되면 staticlibs 리스트에 담고 거른다.
  • is_static_lib 함수에 대해 알아본다.
    이렇게 static library는 걸러진다.
    걸러진 static library파일들은 staticlibs 리스트에 들어간다. 이 것은 밑에 staticlibs 처리에서 사용된다.

stat systemcall 사용하기

  1. broken symlinkELF 탐색에서 거른다.
  2. 실행권한 || 파일경로가 lib && 파일명(.so || .node) || 파일명시작(vmlinux) || 파일명(.ko)
    이면서 링크파일이면 checkelflinks에 담고 거름
    단계까지오면 checkelf[file] = (file, "s.st_dev_s.st_no")의 형태로 담음!

is_elf()

  • is_elf()file바이너리를 사용하여 나오는 출력을 읽는다.예를 들면 위와 같다.
  • exec_type을 비트마스크로 마킹한다.
    • 0: not elf
    • 1: ELF format file
    • 2: stripped
      • 즉, 만약 3이면 ELF+stripped
    • 4: executable
    • 8: shared library
    • 16: kernel mode
  • kernel module 구분법
    • 파일명 끝이 .ko로 끝나면서 파일 경로에 /lib/modules/가 있다. 그리고 is_kernel_module함수 값이 True이다.
  • return (path, exectype)

is_kernel_module()


is_elf 수행

  • 위에서 구해낸 checkelflinks 부터 is_elf() 를 사용한다.
  • symlinks[file] = "../A/B"elf_file & 1 일 경우,
  • elffiles[file] = elf_file

lets process debug splitting

  • elffiles

splitdebuginfo

  • objcopy를 사용해, 1)실제 바이너리와 2)디버그심볼용 바이너리를 분리한다.
  • dwarfsrcfiles를 사용해 디버깅시 필요로하는 소스코드를 주어진 rootfs에서 찾아낸다.

splitstaticdebuginfo 혹은 그냥 source_info


copydebugsources

  • 이렇게 해야 ${WORKDIR}/package에서 /usr/src/debug 에 소스코드들이 ${PN}-src용으로 옮긴다.

splitstaticdebuginfo


runstrip


3. package_do_filedeps

main

  • 바이너리의 RDEPENDS를 체크한다.
    • 패키지이름에 -dbg, -doc, -locale-, -localedata-, -gconv-가 있으면 continue

filedeprunner

  • 이외 패키지들은 이 함수를 거친다. (openembedded-core, oe.package.filedeprunner)

shared library dependency 체크

  • 이제 그럼, 각 패키지바이너리(ELF format)들이 어떤 shared library dependency를 가지는지 봐야함

package ipk化 시, RDEPENDS 변경

  1. packages-split 에서 pciutilsshlibdeps

  1. pkgdata-pdata-input/runtime/pciutils
RDEPENDS:pciutils: pciutils-ids update-alternatives-opkg glibc (>= 2.35) libkmod (>= 29) libpci (>= 3.7.0) libudev (>= 250.5) zlib (>= 1.2.11) 

그런데, deploy-ipks에서 막상 나온 .ipkcontrol파일을 보면,

  • glibc -> libc6로 되어있다.
  • 어떻게 바꾸는 것인가?


runtime/pciutils


runtime/pciutils-dbg


runtime/pciutils-src

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글