프로젝트를 진행하다가 외부 라이브러리를 가져다 써야 하는 일이 생겼다.
보안 관련 라이브러리인데 so 파일로 되어있었다.
기존에는 장치가 RTOS나 Linux에서 C/C++ 기반으로 프로그램을 만들어서 가져다 쓰는데 문제가 없었다.
심지에 라이브러리 제조사에서 C++로 테스트코드까지 작성하여 주었으니 말이다.
그런데 이번에 하는 프로젝트는 JAVA를 이용하고 있다.
설상가상으로 JAVA로 프로그램을 짜는 프로젝트가 이번이 처음이라 주변에 잘 아는 사람들이 없었다.
그래서 이틀간 열심히 구글링을 하고 이것저것 추가해보고 하였다.
처음에는 JNI(Java Native Interface)를 시도하였다.
학부때도 JNI를 썼으니 제일 먼저 생각나는게 이거였다.
일단 동작방법을 확인하려고 단독으로 돌아가는 샘플코드를 짰을때에는 돌아갔다.
근데 프로젝트에 이걸 적용시키려고 하니 잘 안된다.
프로젝트 컴파일을 Maven으로 하는데, JNI를 검색해서 나오는 내용들은 전부 javac를 이용하여 class를 만들고, 그 클래스를 javah로 header파일을 만들라는 내용들뿐이다.
그런데 javac로 하려고하니 오류만 쏟아지고 컴파일이 안된다.
그렇게 하루를 날렸다.
그렇게 검색을 열심히 하다가 JNA(Java Native Access)를 발견하였다.
Header파일을 만들 필요도 없고, 그 Header 파일에 맞춰서 C파일을 컴파일 할 필요도 없다.
그냥 JNA library를 넣어주면 알아서 잘 해준다.
그래서 JNA를 가져다 쓰기로 하였다.
JNA파일은 github.com/java-native-access/jna 에서 가져왔다.
내용물은 많은데, 내가 필요한 것은 라이브러리뿐이라 jna.jar 만 가져왔다.
이 jar 파일을 lib폴더를 만들어 넣을수도 있지만, Maven은 dependency설정으로 라이브러리를 넣을 수 있다.
그래서 pon.xml 파일에 dependency를 임의로 추가하고 만들어진 폴더에 jar 파일을 넣었다.
이렇게 pom.xml을 작성하고 maven install을 해주면 pom경로에 라이브러리가 없다고 오류가 난다.
동시에 해당 파일의 경로를 생성해준다.
그럼 repository에 가서 파일을 넣어주면 된다.
repository의 기본 경로는 C:\Users\사용자이름\.m2\repository 이다.
이곳에 가면 Group id로 된 폴더가 있고, 그 안에 artifact Id 폴더, 그 안에 version 폴더가 생성되어있다.
안에 들어가면 .lastUpdated 로 되어있는 파일들이 생성되어있다.
그러면 가져온 JNA 라이브러리 파일 이름을 맞춰서 넣어주면 된다.
이렇게 안해도 되고 dependency 경로를 임의로 지정해주어도 된다고 후배님이 말씀하였지만, 나는 이게 가장 익숙하다.
라이브러리를 넣었으면 JAVA 소스에서 Native library interface를 만들어준다.
interface에서는 불러올 라이브러리를 설정해주고, 사용할 함수를 정의해주면 된다.
이렇게해서 장비에 넣은 후에 돌리면 해당 라이브러리 함수가 호출된다.
근데 여기서 끝이 아니였다.
저 라이브러리는 내가 다른 라이브러리를 호출하기 위해 만든 라이브러리였다.
즉, JAVA -> 내 so파일 -> 보안 라이브러리 so파일 인것이다.
그런데 내가 만든 so파일에서 보안 라이브러리를 참조하지 못하는 것이다.
그러면 symbol lookup error : undefined symbol 에러가 발생한다.
이리저리 찾아본 결과, LD_PRELOAD를 이용하여 후킹해주었다.
export LD_PRELOAD=라이브러리
근데, 이게 명확한 해결법이 아니라는 말이 있다.
일단은 다른 방법이 없으니 이렇게 사용하였다.
'정리글' 카테고리의 다른 글
JAVA Maven 라이브러리 분리 (without dependency) (0) | 2020.10.16 |
---|---|
JAVA Maven에서 나는 라이브러리를 별도로 쓰고 싶었다 (0) | 2020.09.17 |
IIO - Linux Industrial I/O subsystem (0) | 2020.09.02 |
LWM2M 했던 것들 정리 (0) | 2020.07.14 |
TCP tunneling 을 빙자한 Raw Socket (0) | 2020.06.11 |