gcc -pie vs. -no-pie
디스어셈블 주소지 질문
  https://kldp.org/node/164466

https://stackoverflow.com/questions/37864773/computing-offset-of-a-function-in-memory
--> https://stackoverflow.com/a/37932094


ELF 베이스 주소?

# 링크스크립트가 모여있는 디렉토리.
# 대충 아래와 같이 검색해보면 베이스주소들이 보임.
for f in /usr/lib/x86_64-linux-gnu/ldscripts/*; do echo $f; grep -E "__executable_start|__image_base|Script for" $f; done | less
for f in /usr/lib/x86_64-linux-gnu/ldscripts/*86*; do echo $f; grep -E "__executable_start|__image_base|Script for" $f; done | less
for f in /usr/lib/x86_64-linux-gnu/ldscripts/*x86*; do echo $f; grep -E "__executable_start|__image_base|Script for" $f; done | less

-no-pie 바이너리의 경우,
  -- elf_i386* 스크립트들이 만드는 elf32-i386 바이너리는 0x8048000 베이스주소와 함께 만들어진다 (gcc -m32).
     (관련의견 : https://www.spinics.net/lists/linux-assembly/msg00245.html)
  -- elf_x86_64* 스크립트들이 만드는 elf64-x86-64 바이너리는 0x400000 베이스주소와 함께 만들어진다 (gcc -m64).
  -- elf32_x86_64* 스크립트들이 만드는 elf32-x86-64 바이너리도 0x400000 베이스주소와 함께 만들어진다 (gcc -mx32).

- centos-7까지는 -no-pie가 기본상태였음. centos-8은 테스트시스템이 없어 확인해보지 못함.
- ubuntu-16.04 까지는 -no-pie가 기본, 18.04부터는 -pie가 기본이었음.

Base Address of ELF
  https://stackoverflow.com/questions/18296276/base-address-of-elf

chanik@dev-ubuntu:~/test/elf_base$ ld -melf_i386 --verbose | grep __executable_start
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x08048000)); . = SEGMENT_START("text-segment", 0x08048000) + SIZEOF_HEADERS;
chanik@dev-ubuntu:~/test/elf_base$ ld -melf_x86_64 --verbose | grep __executable_start
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
chanik@dev-ubuntu:~/test/elf_base$ ld -melf32_x86_64 --verbose | grep __executable_start
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
chanik@dev-ubuntu:~/test/elf_base$ ld -melf_i386 -pie --verbose | grep __executable_start
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0)); . = SEGMENT_START("text-segment", 0) + SIZEOF_HEADERS;
chanik@dev-ubuntu:~/test/elf_base$ ld -melf_x86_64 -pie --verbose | grep __executable_start
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0)); . = SEGMENT_START("text-segment", 0) + SIZEOF_HEADERS;
chanik@dev-ubuntu:~/test/elf_base$ ld -melf32_x86_64 -pie --verbose | grep __executable_start
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0)); . = SEGMENT_START("text-segment", 0) + SIZEOF_HEADERS;


훌륭한 자료 : What is the -fPIE option for position-independent executables in gcc and ld?
  https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld

훌륭한 자료 : difference between i386:x64-32 vs i386 vs i386:x86_64
  https://stackoverflow.com/questions/36347063/difference-between-i386x64-32-vs-i386-vs-i386x86-64

 architecture :  emulation   :   format     :       triple
-------------   ------------   ------------   -------------------
- i386:x64-32 : elf32_x86_64 : elf32-x86-64 : x86_64-linux-gnux32 : (64-bit 시스템에서만 동작하는 새로운 32-bit 바이너리. x86_64 새 레지스터 등 다 가용)
- i386        : elf_i386     : elf32-i386   : i[3-6]86-linux-gnu  : (전통적인 32-bit 바이너리. x86_64의 새 레지스터 등 사용 불가능)
- i386:x86_64 : elf_x86_64   : elf64-x86-64 (64-bit 바이너리)     : x86_64-linux-gnu


objdump -f /lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2 /libx32/ld-linux-x32.so.2
objdump -f /lib*/ld*.so*

chanik@dev-ubuntu:~/test/elf_base$ cat t.c
int main(void) { return 0; }
chanik@dev-ubuntu:~/test/elf_base$ gcc -o t1 t.c -no-pie
chanik@dev-ubuntu:~/test/elf_base$ gcc -o t2 t.c -pie
chanik@dev-ubuntu:~/test/elf_base$ gcc -o t3 t.c -static-pie
chanik@dev-ubuntu:~/test/elf_base$ objdump -t t1 | grep ' main'
0000000000401106 g     F .text  000000000000000f              main
chanik@dev-ubuntu:~/test/elf_base$ objdump -t t2 | grep ' main'
0000000000001129 g     F .text  000000000000000f              main
chanik@dev-ubuntu:~/test/elf_base$ objdump -t t3 | grep ' main'
00000000000cb6c0 l     O .data  0000000000000898 main_arena
000000000000a019 g     F .text  0000000000000027 main
chanik@dev-ubuntu:~/test/elf_base$ ./t1
0x401136
chanik@dev-ubuntu:~/test/elf_base$ ./t1
0x401136
chanik@dev-ubuntu:~/test/elf_base$ ./t2
0x55625babb149
chanik@dev-ubuntu:~/test/elf_base$ ./t2
0x5564cc7c6149
chanik@dev-ubuntu:~/test/elf_base$ ./t2
0x562b8a1e8149
chanik@dev-ubuntu:~/test/elf_base$ ./t3
0x7f0d34de9019
chanik@dev-ubuntu:~/test/elf_base$ ./t3
0x7f1699391019
chanik@dev-ubuntu:~/test/elf_base$ ./t3
0x7f035a5d7019
chanik@dev-ubuntu:~/test/elf_base$ ls -al
total 944
drwxrwxr-x 1 chanik chanik     38 Apr 16 11:07 .
drwxrwxr-x 1 chanik chanik    674 Apr 15 13:13 ..
-rw-rw-r-- 1 chanik chanik   3317 Apr 16 11:07 readme.txt
-rwxrwxr-x 1 chanik chanik  16624 Apr 15 10:20 t1
-rwxrwxr-x 1 chanik chanik  16696 Apr 15 10:20 t2
-rwxrwxr-x 1 chanik chanik 917256 Apr 16 10:18 t3
-rw-rw-r-- 1 chanik chanik     70 Apr 15 10:19 t.c
by 시험さま | 2021/04/16 11:04 | 컴퓨터 | 트랙백 | 덧글(0)
DLL virtual address
DLL을 만드는 이유중 하나는,
동일 DLL이 차지하는 메모리 공간을 서로 다른 프로세스들이 공유할 수 있기 때문이다.
각 프로세스들이 나름대로의 가상주소 위치로 DLL 코드를 매핑하겠지만
그 가상주소들은 동일한 실 메모리 페이지들을 가리킨다..??

이렇게 생각하고 있었는데, 실상은 좀 다른 모양이다.

Windows DLL은 PE 헤더에 (링크할때 설정 가능한) prefered base address를 담고 있는데,
이 가상메모리 주소로 로드되는 경우에만 다른 프로세스와 메모리 페이지가 공유 가능한 듯 하다.
DLL 로드할때 해당 베이스주소가 이미 다른 DLL 등에 의해 사용중이면
어쩔 수 없이 다른 가상주소 위치로 읽어들이는 재배치(relocation)가 일어나게 되고
이 경우 점프명령어 주소수정이 일어나는 코드페이지들은 CoW(Copy on Write) 프로텍션에 의해
새 물리페이지로 복사이전 되므로 해당 코드페이지들은 더이상 타 프로세스와 공유되지 않음.

(Windows에서 이렇다는 것이고, 아마 Linux에서는 .so(Shared Object)를 만들때 PIC로 만들어지므로
 프로세스마다 서로 다른 가상주소로 매핑된 .so 코드 페이지들도 서로 공유되는 모양이다.
참고: https://en.wikipedia.org/wiki/Position-independent_code
position-independent code (PIC) or position-independent executable (PIE) is a body of machine code that, being placed somewhere in the primary memory, executes properly regardless of its absolute address. PIC is commonly used for shared libraries, so that the same library code can be loaded in a location in each program address space where it does not overlap with other memory in use (for example, other shared libraries))

따라서 DLL을 링크할때 다른 DLL들과 충돌하지 않도록 적절히 베이스주소를 설정해줘야 메모리 공유가 이뤄지겠는데
문제는, 아무 생각없이 사용자 DLL을 만들어 링크하면 베이스 주소가 기본값(0x10000000)으로 설정되므로
사용자 DLL이 여러개 로드될 경우 재배치가 일어날 수밖에 없다는 것.


Modify the Base Addresses for a DLL Files Series
    https://www.codeproject.com/Articles/35829/Modify-the-Base-Addresses-for-a-DLL-Files-Series

A Dynamic-link library created in Microsoft Visual C++ has default base address 0x10000000 (Visual C# has default base address 0x400000). That means, when the process starts, the system loader tries to load the DLL to this address in the process memory. However, if a number of DLLs have the same base address, only one of them is loaded to its default address. For all other DLLs, the loader makes the relocation: changes the memory addresses in DLL commands according to the new base address where the DLL is loaded. This process is also known as DLL collisions.


Loading Applications and DLLs
    https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection

DLLs are created with a default base address. Every process that uses a DLL will try to load the DLL within its own address space at the default virtual address for the DLL. If multiple applications can load a DLL at its default virtual address, they can share the same physical pages for the DLL. If for some reason a process cannot load the DLL at the default address, it loads the DLL elsewhere.


If relocated DLLs cannot share pages, then doesn’t ASLR cause all pages to be non-shared?
    https://devblogs.microsoft.com/oldnewthing/20160413-00/?p=93301

구식 DLL들은 재배치(relocate)될 경우 프로세스간 메모리 공간 공유가 이뤄지지 않는다.
그럼 ASLR 켜진 상태로 링크된 DLL들은 로드할 때 적재주소가 랜덤화되므로 공유가 불가능한가 하면, 그렇지 않다.
DLL을 최초 로드할 때 랜덤화된 상태가 이후 다른 프로세스에서 DLL을 로드할 때 재활용되면서
메모리페이지가 공유되는 모양이다.

The solution is that when a DLL is loaded, ASLR chooses a random destination address, but it then remembers that address for future use, and if another process loads the DLL, the kernel will try to use the same destination address for the DLL in that other process. This means that if two processes load a DLL, that DLL will probably get the same destination address in both processes, which establishes one of the prerequisites for sharing.


Six Facts about Address Space Layout Randomization on Windows
    https://www.fireeye.com/blog/threat-research/2020/03/six-facts-about-address-space-layout-randomization-on-windows.html

by 시험さま | 2021/03/08 12:30 | 컴퓨터 | 트랙백 | 덧글(0)
ASUS TUF Gaming B460M-PLUS STCOM
ASUS TUF Gaming B460M-PLUS STCOM
    http://www.nowpug.com/field/460601

전력제한만 해제하고 싶을 때,

Ai Tweaker -> Internal CPU Power Management
  - CPU Core/Cache Current Limit Max.: 255.75
  - Long Duration Package Power Duration : 4095
  - Short Duration Package Power Duration : 4095

이 상태로 쓰면 CPU를 All Core Boost 클럭으로 쓸 수 있을 것이다.
Windows 10에서 전원설정을 "고성능"으로 설정해두면
아마 클럭이 계속 부스트 상태로 머무를 것이다.

MSI 박격포 시리즈는 전력제한이 해제된 상태로 출시되므로
이런 설정 하지 않아도 되는 모양이다. 추측임.
by 시험さま | 2021/01/20 17:42 | 컴퓨터 | 트랙백 | 덧글(0)
RHEL7/CentOS 7 – Recover/Reinstall GRUB2 with UEFI
P8Z68-V Pro/Gen3 보드에 x86_64-efi 상태로 CentOS7이 설치돼있는데
윈도우10 설치된 SSD를 달아 윈도우10으로 부팅했다가
다시 CentOS7 설치된 SSD로 교체했더니 부팅 불가능 상태로 빠졌다.

아예 grub도 못찾는 채로, 부팅 가능한 디스크를 넣으라는 식으로 나왔다.

일단 grub 재설치를 시도했다.
CentOS7 설치DVD로 복구모드 부팅하여 아래와 같이 시도했다.
( DVD부팅 -> Troubleshooting -> Rescue a CentOS Linux system -> 1) Continue -> press <return> to get a shell -> chroot /mnt/sysimage -> 인터넷 접근 필요시 ifconfig 또는 dhclient 로 IP 설정 )

# grub2-install /dev/sda
grub2-install: error: /usr/lib/grub/x86_64-efi/modinfo.sh doesn't exist. Please specify --target or --directory.

위와 같이 grub 재설치 오류가 발생했고,
아래와 같이 패키지 추가설치후 grub2-install 정상 동작함

# yum install grub2-efi-x64-modules
# grub2-install /dev/sda

여기까지 하고 부팅해보니 grub> 프롬프트까지는 떴다.
하지만 그 이상은 진행되지 않음.
다시 설치DVD로 부팅하여,

# cd /boot/efi/EFI/centos/
# ls -al
total 7036
drwx------. 4 root root    4096 May 12 14:14 .
drwx------. 4 root root    4096 Apr 23  2020 ..
-rwx------. 1 root root     134 Feb 22  2019 BOOT.CSV
-rwx------. 1 root root     134 Feb 22  2019 BOOTX64.CSV
drwx------. 2 root root    4096 Apr 23  2020 fonts
drwx------. 2 root root    4096 Nov  9  2018 fw
-rwx------. 1 root root   68168 Nov  9  2018 fwupia32.efi
-rwx------. 1 root root   77600 Nov  9  2018 fwupx64.efi
-rwx------. 1 root root    5455 Sep 10 08:10 grub.cfg
-rwx------. 1 root root    1024 Apr 23  2020 grubenv
-rwx------. 1 root root 1090976 Aug  8  2019 grubx64.efi
-rwx------. 1 root root 1151864 Feb 22  2019 mmx64.efi
-rwx------. 1 root root 1151864 Feb 22  2019 MokManager.efi
-rwx------. 1 root root 1205248 Feb 22  2019 shim.efi
-rwx------. 1 root root 1198984 Feb 22  2019 shimx64-centos.efi
-rwx------. 1 root root 1205248 Feb 22  2019 shimx64.efi

정상동작하는 PC에서는 grubx64.efi 파일이 위와 같이 10MB 정도로 존재하는데
문제가 생긴 PC에서는 훨씬 작은 크기(1/10 정도 크기)로 만들어져 있었다.

정상동작하는 PC로부터 복사해 넣어봤지만,
grub2-install 명령을 실행할 때마다 작은 크기로 새로 만들어지고 있었음.

구글 검색하며 이짓 저짓 해보다가,
아래의 안내자료를 따라 grub2-install 실행후 아래 명령을 실행해보니 정상 크기로 다시 만들어졌다.
이 상태로 재부팅해보니 부팅 성공.

RHEL7/CentOS 7 – Recover/Reinstall GRUB2 with UEFI
    https://www.unixarena.com/2018/05/rhel7-centos-7-recover-reinstall-grub2-with-uefi.html/

# yum reinstall grub2-efi shim

grub2-efi-x64-modules 패키지는 grub2-install 실행을 위해 새로 설치으나 이젠 불필요한 것 같아 제거함.

# yum remove grub2-efi-x64-modules

# exit
# init 6


------

처음 겪었을땐 CentOS7 설치된 SSD의 grub이 깨진 것이라 여겼는데,
두 번째 겪어보니 CentOS7 SSD에 아무 변경사항이 없어도 발생하는 문제였다.
상황을 정리해보면 아래와 같았다.

1. CentOS7 SSD만 달린 상태에서 CentOS7 사용하다가 종료후 CentOS7 SSD 제거,
2. 이후 윈도우10 SSD만 달고 윈도우10 부팅하여 사용하다가 종료후 윈도우10 SSD 제거,
3. 다시 CentOS7 SSD 달고 부팅시도했으나 부팅 불가능.

아래 페이지에, EFI 시스템에서는 grub2-install 을 쓰지 말라는 주의가 나온다.
내가 겪엇던 grubx64.efi 파일 관련문제에 대한 힌트가 될 수 있겠다.

https://fedoraproject.org/wiki/GRUB_2

grub2-install shouldn't be used on EFI systems. The grub2-efi package installs a prebaked grubx64.efi on the EFI System partition, which looks for grub.cfg on the ESP in /EFI/fedora/ whereas the grub2-install command creates a custom grubx64.efi, deletes the original installed one, and looks for grub.cfg in /boot/grub2/.

결국, 문제의 해답은 아래의 한 줄이었을지도 모르겠다.
상황을 재현하여 실험하면 확인되겠지만.. 같은 일을 또 겪으면 해봐야겠다..

# yum reinstall grub2-efi shim


------

SATA SSD에 설치돼있던 CentOS7을 M.2 NVME 디스크로 옮겨넣고 부팅 시도했더니
루트파티션을 못 찾아 부팅이 안 되는 현상이 생겨서
CentOS7 설치디스크로 부팅한 다음 아래와 같이 initramfs 다시 만들어서 해결함.

# dracut --regenerate-all --force && grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

by 시험さま | 2020/10/26 15:58 | 컴퓨터 | 트랙백 | 덧글(2)
GCC-8.3.1 on CentOS7
CentOS7의 기본 GCC 버전은 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39) 인 모양인데,
더 최신에 가까운 버전이 필요하면 아래와 같이 할 수 있겠다.

The Software Collections ( SCL ) Repository
    https://wiki.centos.org/AdditionalResources/Repositories/SCL
Developer Toolset 8 by Software Collections
    https://www.softwarecollections.org/en/scls/rhscl/devtoolset-8/

(사이트를 검색해보면 Developer Toolset 7도 있다. Python 등 다른 패키지들도 찾을 수 있음)

# 1. Install a package with repository for your system:
# On CentOS, install package centos-release-scl available in CentOS repository:
$ sudo yum install centos-release-scl

# On RHEL, enable RHSCL repository for you system:
$ sudo yum-config-manager --enable rhel-server-rhscl-7-rpms

# 2. Install the collection:
$ sudo yum install devtoolset-8

# 3. Start using software collections: (devtoolset-8 컬렉션이 활성화된 상태의 bash 실행)
$ scl enable devtoolset-8 bash


아래 패키지들이 설치됐다.

================================================================================
 Package                        Arch   Version             Repository      Size
================================================================================
Installing:
 devtoolset-8                   x86_64 8.1-1.el7           centos-sclo-rh 5.4 k
Installing for dependencies:
 devtoolset-8-binutils          x86_64 2.30-55.el7.2       centos-sclo-rh 5.5 M
 devtoolset-8-dwz               x86_64 0.12-1.1.el7        centos-sclo-rh  98 k
 devtoolset-8-dyninst           x86_64 9.3.2-6.el7         centos-sclo-rh 3.6 M
 devtoolset-8-elfutils          x86_64 0.176-1.el7         centos-sclo-rh 431 k
 devtoolset-8-elfutils-libelf   x86_64 0.176-1.el7         centos-sclo-rh 202 k
 devtoolset-8-elfutils-libs     x86_64 0.176-1.el7         centos-sclo-rh 311 k
 devtoolset-8-gcc               x86_64 8.3.1-3.2.el7       centos-sclo-rh  30 M
 devtoolset-8-gcc-c++           x86_64 8.3.1-3.2.el7       centos-sclo-rh  12 M
 devtoolset-8-gcc-gfortran      x86_64 8.3.1-3.2.el7       centos-sclo-rh  12 M
 devtoolset-8-gdb               x86_64 8.2-3.el7           centos-sclo-rh 3.4 M
 devtoolset-8-libquadmath-devel x86_64 8.3.1-3.2.el7       centos-sclo-rh 155 k
 devtoolset-8-libstdc++-devel   x86_64 8.3.1-3.2.el7       centos-sclo-rh 2.7 M
 devtoolset-8-ltrace            x86_64 0.7.91-1.el7        centos-sclo-rh 148 k
 devtoolset-8-make              x86_64 1:4.2.1-4.el7       centos-sclo-rh 485 k
 devtoolset-8-memstomp          x86_64 0.1.5-5.el7         centos-sclo-rh 442 k
 devtoolset-8-oprofile          x86_64 1.3.0-2.el7         centos-sclo-rh 1.8 M
 devtoolset-8-perftools         x86_64 8.1-1.el7           centos-sclo-rh 2.8 k
 devtoolset-8-runtime           x86_64 8.1-1.el7           centos-sclo-rh  20 k
 devtoolset-8-strace            x86_64 4.24-4.el7          centos-sclo-rh 1.0 M
 devtoolset-8-systemtap         x86_64 3.3-2.el7           centos-sclo-rh 144 k
 devtoolset-8-systemtap-client  x86_64 3.3-2.el7           centos-sclo-rh 2.8 M
 devtoolset-8-systemtap-devel   x86_64 3.3-2.el7           centos-sclo-rh 2.2 M
 devtoolset-8-systemtap-runtime x86_64 3.3-2.el7           centos-sclo-rh 427 k
 devtoolset-8-toolchain         x86_64 8.1-1.el7           centos-sclo-rh 3.0 k
 devtoolset-8-valgrind          x86_64 1:3.14.0-16.el7     centos-sclo-rh  11 M
 kernel-debug-devel             x86_64 3.10.0-1127.13.1.el7
                                                           updates         18 M
 libgfortran5                   x86_64 8.3.1-2.1.1.el7     base           796 k
 libquadmath                    x86_64 4.8.5-39.el7        base           190 k

Transaction Summary
================================================================================
Install  1 Package (+28 Dependent packages)


배포판 기본 버전 컴파일러 대신 새로 설치한 버전들을 쓰려면 아래와 같이 한다.

$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
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.

$ echo $$
713
$ scl enable devtoolset-8 bash
$ echo $$
13310
$ gcc --version
gcc (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3)
Copyright (C) 2018 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.
by 시험さま | 2020/07/30 10:24 | 컴퓨터 | 트랙백 | 덧글(0)
대우 루컴즈 T6503TU IPS HDR 소비전력
대우 루컴즈 T6503TU IPS HDR 소비전력
( http://www.gsshop.com/prd/prd.gs?prdid=54613699 )

대각선길이 165cm = 1.65m
가로:세로 = 16:9

(16x)^2 + (9x)^2 = 1.65^2
x^2 = 1.65^2 / (16^2 + 9^2) = 0.0080786350148367952522255192878338
x = 0.089881227265969144933268062925421 미터
 
가로 = 16x = 1.4380996362555063189322890068 미터
세로 =  9x = 0.808931045393722304399412566325 미터

넓이 = 가로 * 세로 = 1.1633234421364985163204747774372 제곱미터

소비전력 = (제곱미터당 소비전력) * 넓이 = 74.8 * 넓이 = 87.016593471810089020771513352288

--> 87와트, 2등급 제품이라고 함.
    (판매자 페이지에는 76.8W라고 나옴..)


ㅇ 참고 : 소비전력 조회
  * https://rankro.tistory.com/279
   --> https://eep.energy.or.kr/certification/certi_list_143.aspx
   --> https://eep.energy.or.kr/certification/certi_view_143.aspx?no=143200502
by 시험さま | 2020/07/16 16:31 | 컴퓨터 | 트랙백 | 덧글(0)
pypy3 in Ubuntu-18.04
https://askubuntu.com/questions/1075813/where-is-pypy-for-python-3-5-on-bionic-18-04-lts

Ubuntu 18.04 에는 pypy 패키지는 있으나 pypy3는 제공되지 않는다.
아래와 같은 방법들이 있는 모양이다.

1. pypy 홈페이지에서 바이너리 패키지를 직접 다운로드하여 쓴다.
2. ppa를 추가하고 apt로 설치한다.
3. snap을 이용하여 설치한다.
4. conda를 이용하여 설치한다.


[1] pypy 홈페이지에서 바이너리 패키지를 직접 다운로드하여 쓴다.

    https://www.pypy.org/download.html#linux-binaries-and-common-distributions


[2] ppa를 추가하고 apt로 설치한다.

$ sudo add-apt-repository ppa:pypy/ppa
sudo: add-apt-repository: command not found
$ sudo apt install software-properties-common
 The latest release of PyPy packaged for stable Ubuntu releases.

This PPA also contains builds of CFFI for cPython - python-cffi.
 More info: https://launchpad.net/~pypy/+archive/ubuntu/ppa
Press [ENTER] to continue or Ctrl-c to cancel adding it.

Hit:1 http://mirror.kakao.com/ubuntu bionic InRelease
Hit:2 http://mirror.kakao.com/ubuntu bionic-updates InRelease
Hit:3 http://mirror.kakao.com/ubuntu bionic-backports InRelease
Hit:4 http://mirror.kakao.com/ubuntu bionic-security InRelease
Get:5 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:6 http://ppa.launchpad.net/pypy/ppa/ubuntu bionic InRelease [15.4 kB]
Hit:7 http://us.archive.ubuntu.com/ubuntu bionic InRelease
Get:8 http://us.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:9 http://ppa.launchpad.net/pypy/ppa/ubuntu bionic/main amd64 Packages [3,364 B]
Hit:10 https://esm.ubuntu.com/ubuntu trusty-infra-security InRelease
Hit:11 https://esm.ubuntu.com/ubuntu trusty-infra-updates InRelease
Get:12 http://us.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:13 http://ppa.launchpad.net/pypy/ppa/ubuntu bionic/main i386 Packages [3,372 B]
Get:14 http://ppa.launchpad.net/pypy/ppa/ubuntu bionic/main Translation-en [1,608 B]
Fetched 276 kB in 2s (114 kB/s)
Reading package lists... Done

$ sudo apt update
$ sudo apt install pypy3

$ sudo pypy3 -m ensurepip
Traceback (most recent call last):
  File "/usr/lib/pypy3/lib-python/3/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/pypy3/lib-python/3/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/pypy3/lib-python/3/ensurepip/__main__.py", line 5, in <module>
    sys.exit(ensurepip._main())
  File "/usr/lib/pypy3/lib-python/3/ensurepip/__init__.py", line 220, in _main
    version="pip {}".format(version()),
  File "/usr/lib/pypy3/lib-python/3/ensurepip/__init__.py", line 69, in version
    assert len(wheel_names) == 1, wheel_names
AssertionError: []

pypy3 pip broken
    https://bugs.launchpad.net/ubuntu/+source/pypy3/+bug/1874157

....


뭔가 귀찮아져서 삭제하고 치움.

$ sudo apt remove pypy3
$ sudo apt autoremove
$ sudo add-apt-repository -r ppa:pypy/ppa


[3] snap을 이용하여 설치한다.

How to Install and Use Snap on Ubuntu 18.04
    https://codeburst.io/how-to-install-and-use-snap-on-ubuntu-18-04-9fcb6e3b34f9

$ sudo apt install snapd
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  squashfs-tools
Suggested packages:
  zenity | kdialog
The following NEW packages will be installed:
  snapd squashfs-tools
0 upgraded, 2 newly installed, 0 to remove and 19 not upgraded.
Need to get 20.0 MB of archives.
After this operation, 98.0 MB of additional disk space will be used.
Do you want to continue? [Y/n]
Get:1 http://mirror.kakao.com/ubuntu bionic-updates/main amd64 squashfs-tools amd64 1:4.3-6ubuntu0.18.04.1 [110 kB]
Get:2 http://mirror.kakao.com/ubuntu bionic-updates/main amd64 snapd amd64 2.45.1+18.04 [19.8 MB]
Fetched 20.0 MB in 2s (11.0 MB/s)
Selecting previously unselected package squashfs-tools.
(Reading database ... 116298 files and directories currently installed.)
Preparing to unpack .../squashfs-tools_1%3a4.3-6ubuntu0.18.04.1_amd64.deb ...
Unpacking squashfs-tools (1:4.3-6ubuntu0.18.04.1) ...
Selecting previously unselected package snapd.
Preparing to unpack .../snapd_2.45.1+18.04_amd64.deb ...
Unpacking snapd (2.45.1+18.04) ...
Setting up squashfs-tools (1:4.3-6ubuntu0.18.04.1) ...
Setting up snapd (2.45.1+18.04) ...
Created symlink /etc/systemd/system/multi-user.target.wants/snapd.apparmor.service → /lib/systemd/system/snapd.apparmor.service.
Created symlink /etc/systemd/system/multi-user.target.wants/snapd.autoimport.service → /lib/systemd/system/snapd.autoimport.service.
Created symlink /etc/systemd/system/multi-user.target.wants/snapd.core-fixup.service → /lib/systemd/system/snapd.core-fixup.service.
Created symlink /etc/systemd/system/multi-user.target.wants/snapd.recovery-chooser-trigger.service → /lib/systemd/system/snapd.recovery-chooser-trigger.service.
Created symlink /etc/systemd/system/multi-user.target.wants/snapd.seeded.service → /lib/systemd/system/snapd.seeded.service.
Created symlink /etc/systemd/system/cloud-final.service.wants/snapd.seeded.service → /lib/systemd/system/snapd.seeded.service.
Created symlink /etc/systemd/system/multi-user.target.wants/snapd.service → /lib/systemd/system/snapd.service.
Created symlink /etc/systemd/system/timers.target.wants/snapd.snap-repair.timer → /lib/systemd/system/snapd.snap-repair.timer.
Created symlink /etc/systemd/system/sockets.target.wants/snapd.socket → /lib/systemd/system/snapd.socket.
Created symlink /etc/systemd/system/final.target.wants/snapd.system-shutdown.service → /lib/systemd/system/snapd.system-shutdown.service.
snapd.failure.service is a disabled or a static unit, not starting it.
snapd.snap-repair.service is a disabled or a static unit, not starting it.
Processing triggers for mime-support (3.60ubuntu1) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...

$ snap find pypy3
Name   Version  Publisher    Notes    Summary
pypy3  7.3.1    pypyproject  classic  PyPy is a fast, compliant alternative implementation of the Python language

$ sudo snap install pypy3 --classic
2020-07-09T10:57:38+09:00 INFO Waiting for automatic snapd restart...
pypy3 7.3.1 from The PyPy Project (pypyproject) installed

$ pypy3 --version
Command 'pypy3' is available in '/snap/bin/pypy3'
The command could not be located because '/snap/bin' is not included in the PATH environment variable.
pypy3: command not found


아래와 같이 /etc/environment 수정

$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
$ source /etc/environment
$ pypy3 --version
Python 3.6.9 (2ad108f17bdb, Apr 07 2020, 02:59:05)
[PyPy 7.3.1 with GCC 7.3.1 20180303 (Red Hat 7.3.1-5)]

$ sudo du -sk /snap
443627  /snap

$ pypy3 -m ensurepip
$ pypy3 -m pip install --upgrade pip wheel
$ pypy3 -m pip install bs4 requests

이렇게 패키지를 추가설치하면, ~/.local 디렉토리 안에 bin, lib 디렉토리가 만들어지고
그 아래에 아래와 같이 site-packages 디렉토리가 관리된다.

$ ls -al ~/.local/lib/pypy3.6/site-packages/
total 104
drwx------ 25 chanik chanik 4096 Jul  9 11:53 .
drwx------  3 chanik chanik 4096 Jul  9 11:30 ..
drwxrwxr-x  2 chanik chanik 4096 Jul  9 11:35 beautifulsoup4-4.9.1.dist-info
drwxrwxr-x  5 chanik chanik 4096 Jul  9 11:35 bs4
drwxr-xr-x  2 chanik chanik 4096 Jul  9 11:52 bs4-0.0.1.dist-info
drwxr-xr-x  3 chanik chanik 4096 Jul  9 11:53 certifi
drwxr-xr-x  2 chanik chanik 4096 Jul  9 11:53 certifi-2020.6.20.dist-info
drwxr-xr-x  4 chanik chanik 4096 Jul  9 11:53 chardet
drwxr-xr-x  2 chanik chanik 4096 Jul  9 11:53 chardet-3.0.4.dist-info
-rw-rw-r--  1 chanik chanik  126 Jul  9 11:30 easy_install.py
drwxr-xr-x  3 chanik chanik 4096 Jul  9 11:53 idna
drwxr-xr-x  2 chanik chanik 4096 Jul  9 11:53 idna-2.10.dist-info
drwxrwxr-x  5 chanik chanik 4096 Jul  9 11:36 pip
drwxrwxr-x  2 chanik chanik 4096 Jul  9 11:36 pip-20.1.1.dist-info
drwxrwxr-x  5 chanik chanik 4096 Jul  9 11:30 pkg_resources
drwxrwxr-x  2 chanik chanik 4096 Jul  9 11:30 __pycache__
drwxr-xr-x  3 chanik chanik 4096 Jul  9 11:53 requests
drwxr-xr-x  2 chanik chanik 4096 Jul  9 11:53 requests-2.24.0.dist-info
drwxrwxr-x  6 chanik chanik 4096 Jul  9 11:30 setuptools
drwxrwxr-x  2 chanik chanik 4096 Jul  9 11:30 setuptools-44.0.0.dist-info
drwxrwxr-x  3 chanik chanik 4096 Jul  9 11:35 soupsieve
drwxrwxr-x  2 chanik chanik 4096 Jul  9 11:35 soupsieve-2.0.1.dist-info
drwxr-xr-x  6 chanik chanik 4096 Jul  9 11:53 urllib3
drwxr-xr-x  2 chanik chanik 4096 Jul  9 11:53 urllib3-1.25.9.dist-info
drwxr-xr-x  4 chanik chanik 4096 Jul  9 11:52 wheel
drwxr-xr-x  2 chanik chanik 4096 Jul  9 11:52 wheel-0.34.2.dist-info

이 구조는 각 사용자별로 관리되는 것 같고, 다른 사용자로 로긴하여 pypy3 실행하면
bs4, requests같은 추가설치 패키지는 존재하지 않는 것처럼 나온다.

root 프롬프트에서 pip install 해 보면, /root/.local 아래에 만들어짐.
시스템 전체에 반영되도록 설치할 방법을 모르겠다.

.. 삭제하고 치움.

$ sudo snap remove pypy3
$ sudo rm -rf ~/.local /root/.local
$ sudo rm -rf /remove/snap
$ ...


참고:

$ sudo snap refresh pypy3



[4] conda를 이용하여 설치한다.

https://anaconda.org/conda-forge/pypy3.6



Miniconda vs. Miniforge?

Miniconda는 아나콘다 설치스크립트인것 같고
Miniforge는 pypy3 지원이 추가된 Miniconda의 변종인듯.

How to Install Anaconda on Ubuntu 18.04 and 20.04
    https://phoenixnap.com/kb/how-to-install-anaconda-ubuntu-18-04-or-20-04



$ wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-Linux-x86_64.sh
$ sudo su -c "bash Miniforge-pypy3-Linux-x86_64.sh -bfp /anaconda"
PREFIX=/anaconda
Unpacking payload ...
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /anaconda

  added / updated specs:
    - _libgcc_mutex==0.1=conda_forge
    - _openmp_mutex==4.5=0_gnu
    - bzip2==1.0.8=h516909a_2
    - ca-certificates==2020.4.5.1=hecc5488_0
    - certifi==2020.4.5.1=py36hc560c46_0
    - chardet==3.0.4=py36hc560c46_1006
    - conda-package-handling==1.6.0=py36h97a6639_2
    - conda==4.8.3=py36hc560c46_2
    - cryptography==2.9.2=py36h8bdcdef_0
    - expat==2.2.9=he1b5a44_2
    - gdbm==1.18=h0a1914f_1
    - idna==2.9=py_1
    - libffi==3.2.1=he1b5a44_1007
    - libgcc-ng==9.2.0=h24d8f2e_2
    - libgomp==9.2.0=h24d8f2e_2
    - libstdcxx-ng==9.2.0=hdf63c60_2
    - ncurses==6.1=hf484d3e_1002
    - openssl==1.1.1g=h516909a_0
    - pip==20.1.1=py_1
    - pycosat==0.6.3=py36h97a6639_1004
    - pyopenssl==19.1.0=py_1
    - pypy3.6==7.3.1=h3e02ecb_1
    - pysocks==1.7.1=py36hc560c46_1
    - python==3.6.9=2_73_pypy
    - python_abi==3.6=1_pypy36_pp73
    - readline==8.0=hf8c457e_0
    - requests==2.23.0=pyh8c360ce_2
    - ruamel_yaml==0.15.80=py36h97a6639_1001
    - setuptools==46.4.0=py36hc560c46_0
    - six==1.15.0=pyh9f0ad1d_0
    - sqlite==3.30.1=hcee41ef_0
    - tk==8.6.10=hed695b0_0
    - tqdm==4.46.0=pyh9f0ad1d_0
    - urllib3==1.25.8=py36hc560c46_1
    - wheel==0.34.2=py_1
    - xz==5.2.5=h516909a_0
    - yaml==0.2.4=h516909a_0
    - zlib==1.2.11=h516909a_1006


The following NEW packages will be INSTALLED:

  _libgcc_mutex      conda-forge/linux-64::_libgcc_mutex-0.1-conda_forge
  _openmp_mutex      conda-forge/linux-64::_openmp_mutex-4.5-0_gnu
  bzip2              conda-forge/linux-64::bzip2-1.0.8-h516909a_2
  ca-certificates    conda-forge/linux-64::ca-certificates-2020.4.5.1-hecc5488_0
  certifi            conda-forge/linux-64::certifi-2020.4.5.1-py36hc560c46_0
  chardet            conda-forge/linux-64::chardet-3.0.4-py36hc560c46_1006
  conda              conda-forge/linux-64::conda-4.8.3-py36hc560c46_2
  conda-package-han~ conda-forge/linux-64::conda-package-handling-1.6.0-py36h97a6639_2
  cryptography       conda-forge/linux-64::cryptography-2.9.2-py36h8bdcdef_0
  expat              conda-forge/linux-64::expat-2.2.9-he1b5a44_2
  gdbm               conda-forge/linux-64::gdbm-1.18-h0a1914f_1
  idna               conda-forge/noarch::idna-2.9-py_1
  libffi             conda-forge/linux-64::libffi-3.2.1-he1b5a44_1007
  libgcc-ng          conda-forge/linux-64::libgcc-ng-9.2.0-h24d8f2e_2
  libgomp            conda-forge/linux-64::libgomp-9.2.0-h24d8f2e_2
  libstdcxx-ng       conda-forge/linux-64::libstdcxx-ng-9.2.0-hdf63c60_2
  ncurses            conda-forge/linux-64::ncurses-6.1-hf484d3e_1002
  openssl            conda-forge/linux-64::openssl-1.1.1g-h516909a_0
  pip                conda-forge/noarch::pip-20.1.1-py_1
  pycosat            conda-forge/linux-64::pycosat-0.6.3-py36h97a6639_1004
  pyopenssl          conda-forge/noarch::pyopenssl-19.1.0-py_1
  pypy3.6            conda-forge/linux-64::pypy3.6-7.3.1-h3e02ecb_1
  pysocks            conda-forge/linux-64::pysocks-1.7.1-py36hc560c46_1
  python             conda-forge/linux-64::python-3.6.9-2_73_pypy
  python_abi         conda-forge/linux-64::python_abi-3.6-1_pypy36_pp73
  readline           conda-forge/linux-64::readline-8.0-hf8c457e_0
  requests           conda-forge/noarch::requests-2.23.0-pyh8c360ce_2
  ruamel_yaml        conda-forge/linux-64::ruamel_yaml-0.15.80-py36h97a6639_1001
  setuptools         conda-forge/linux-64::setuptools-46.4.0-py36hc560c46_0
  six                conda-forge/noarch::six-1.15.0-pyh9f0ad1d_0
  sqlite             conda-forge/linux-64::sqlite-3.30.1-hcee41ef_0
  tk                 conda-forge/linux-64::tk-8.6.10-hed695b0_0
  tqdm               conda-forge/noarch::tqdm-4.46.0-pyh9f0ad1d_0
  urllib3            conda-forge/linux-64::urllib3-1.25.8-py36hc560c46_1
  wheel              conda-forge/noarch::wheel-0.34.2-py_1
  xz                 conda-forge/linux-64::xz-5.2.5-h516909a_0
  yaml               conda-forge/linux-64::yaml-0.2.4-h516909a_0
  zlib               conda-forge/linux-64::zlib-1.2.11-h516909a_1006


Preparing transaction: done
Executing transaction: done
installation finished.

$ du -sk /anaconda
376660  /anaconda

아래와 같이 수정?
$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/anaconda/bin"
$ source /etc/environment

$ conda install bs4

이하의 내용은 사용자별 설정을 만들기 위한 것 같고
여기까지만 해도 system-wide 설치는 끝난 듯함.
이 상태로 /anaconda/bin 을 경로에 넣는 것만 신경쓰며 그냥 써도 되는 것 같다.

$ conda config --set channel_priority strict
$ conda create -n pypy pypy
$ conda init
$ conda activate pypy
  # 이 문맥에서는 /anaconda 아래의 패키지셋을 보여주거나 설치하는 것이 아니고,
  # 사용자정의 환경인 pypy environment 아래, 즉 ~chanik/.conda 아래쯤에 설치하는 듯
  # system-wide 환경과는 별도관리되는 것 같다.
  $ conda list
  $ conda install bs4
$ conda deactivate

번거로워서 아래와 같이 사용자정의 설정은 날려버렸다.
.bascrc 하단에 conda init 명령에 의해 자동추가된 스크립트 조각 삭제후 아래 파일들 청소.
$ sudo rm -rf .cache .conda .condarc


아래 페이지에 잘 정리돼 있는 듯.

Conda의 설치, 기초 사용법

지금의 설치상태는,

$ conda env list
# conda environments:
#
base                  *  /anaconda

by 시험さま | 2020/07/09 10:38 | 컴퓨터 | 트랙백 | 덧글(0)
< 이전페이지 다음페이지 >