일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 | 31 |
- 난독화
- uftrace
- tracing
- v8 tracing
- LLVM Obfuscator
- anti debugging
- so inject
- Android
- on-stack replacement
- pinpoint
- 안티디버깅
- v8 optimizing
- pthread
- TLS
- linux debugging
- Linux custom packer
- apm
- Injection
- linux thread
- Linux packer
- tracerpid
- LLVM
- custom packer
- android inject
- initial-exec
- LLVM 난독화
- on stack replacement
- OSR
- Obfuscator
- thread local storage
- Today
- Total
Why should I know this?
Linux Thread Local Storage 공부 및 적용 본문
과거 Linux에서 사용할 수 있는 Thread Local Storage 종류와 차이를 다룬 적이 있다.
https://die4taoam.tistory.com/37
Linux TLS 에 대한 설명은 링크에 있다.
Linux TLS 를 공부하게 된 이유는 Nodejs Tracing 기능을 Uftrace에 넣기 위한 시도 중에 재귀호출이 확인되서 였는데, Uftrace가 과거 사용했던 __thread 로 시작되는 local/global dynamic 이 내부적으로 호출하는 함수 때문에 생기는 문제였다.
struct tls *test = &find_me;
# 201fe0 <find_me@@Base+0x201fe0>
166a: 66 48 8d 3d 6e 09 20 data16 lea 0x20096e(%rip),%rdi
1671: 00
1672: 66 66 48 e8 76 f7 ff data16 data16 callq df0 <__tls_get_addr@plt>
1679: ff
여기서 호출하는 __tls_get_addr 이라는 함수가 Uftrace가 재귀호출하게 만드는 함수였다. 문제 원인 파악 및 해결책을 강구하는 과정에서 과거 POSIX 스타일의 표준함수가 아닌 Linux의 TLS 모델을 제안한 문서를 접하게 되었고 여기서 영감을 얻어 initial-exec 타입으로 TLS 변수를 변경하게 되었던 것이다.
해당 문서는 다음 링크를 참고하길 바란다.
https://www.fsfla.org/~lxoliva/writeups/TLS/RFC-TLSDESC-x86.txt
initial-exec로 선언된 TLS 변수는 링크된 글에서 나오듯 다음처럼 번역되고 별도의 함수호출이 필요없다.
mov 0x2d6a6 (% rip),% rax # 35fc8 <.got + 0x38>
mov% fs: (% rax),% rbx
이 스터디를 진행한 이유가 됐던 기능은 아직 병합하지 못했다.
하지만 어쨌든 공부했던게 헛된 일은 아니다.
공부했던 내용과 관련 커밋만 추려서 병합 요청하면 되기 때문~
https://github.com/ParkHanbum/uftrace/commit/8851fa68066ca2ae3017508aef6d0e1e9c607ba9
Linux에서 POSIX 타입 TLS 를 사용할 때의 성능차이는 공부 글 막바지에 포함되어 있지만,
별개로 Uftrace에서의 테스트 결과를 첨부한다 .
대략 240개 정도의 포본에서 표준편차 제외 233개 항목 대상.
- 평균 8.98ms 의 실행시간 단축.
- 약 7.2% 정도의 성능 향상
(표준편차 이렇게 적용하는게 맞긴 맞는걸까요...? _-)
내가 원하는 기능을 구현하기 위해 어쩔 수 없이 공부해야 했던 것도 가끔은 이렇게 도움이 될 수 있다랄까?
제 블로그 표어 값 하는 글을 자주 쓸 수 있었으면 좋겠네요.
'Knowledge > Architecture' 카테고리의 다른 글
Memory Barrier for self-modifying code (0) | 2020.01.19 |
---|