Linux의 ar 명령을 사용하여 정적 라이브러리를 만드는 방법

0
1476
Linux 랩톱의 셸 프롬프트
Fatmawati Achmad Zaenuri / Shutterstock.com

리눅스 사용 ar 소프트웨어를 개발할 때 함수 라이브러리를 작성하는 명령입니다. 이 학습서에서는 정적 라이브러리 작성, 수정 및 프로그램에서 샘플 코드로 완료하는 방법을 보여줍니다.

그만큼 ar 지휘관은 진정한 베테랑입니다. 1971 년부터 사용되었습니다. ar 아카이브 파일을 작성하기위한 도구의 원래 용도를 참조합니다. 아카이브 파일은 다른 파일의 컨테이너 역할을하는 단일 파일입니다. 다른 많은 파일의 경우가 있습니다. 아카이브에서 파일을 추가, 제거 또는 추출 할 수 있습니다. 해당 유형의 기능을 찾는 사람들은 더 이상 ar. 그 역할은 다음과 같은 다른 유틸리티에 의해 인수되었습니다 tar.

그만큼 ar 그래도 몇 가지 전문적인 목적으로 명령이 사용됩니다. ar 정적 라이브러리를 만드는 데 사용됩니다. 이들은 소프트웨어 개발에 사용됩니다. 과 ar 또한 데비안 리눅스 배포판에서 사용되는“.deb”파일과 같은 패키지 파일과 우분투와 같은 파생 파일을 만드는 데 사용됩니다.

정적 라이브러리를 만들고 수정하는 데 필요한 단계를 수행하고 프로그램에서 라이브러리를 사용하는 방법을 보여 드리겠습니다. 그러기 위해서는 정적 라이브러리가 충족되어야합니다. 이 라이브러리의 목적은 텍스트 문자열을 인코딩하고 인코딩 된 텍스트를 디코딩하는 것입니다.

이것은 데모 목적으로 빠르고 더러운 해킹입니다. 중요한 암호화에는이 암호화를 사용하지 마십시오. A는 B가되고 B는 C가되는 등 세계에서 가장 간단한 대체 암호입니다.

관련 : Linux에서 tar 명령을 사용하여 파일을 압축하고 추출하는 방법

cipher_encode () 및 cipher_decode () 함수

우리는“library”라는 디렉토리에서 작업하고 나중에“test”라는 하위 디렉토리를 만들 것입니다.

이 디렉토리에는 두 개의 파일이 있습니다. cipher_encode.c라는 텍스트 파일에는 cipher_encode() 함수:

void cipher_encode(char *text)
{
 for (int i=0; text(i) != 0x0; i++) {
   text(i)++;
 }

} // end of cipher_encode

해당 cipher_decode() 함수는 cipher_decode.c라는 텍스트 파일에 있습니다.

void cipher_decode(char *text)
{
 for (int i=0; text(i) != 0x0; i++) {
   text(i)--;
 }

} // end of cipher_decode

프로그래밍 명령이 포함 된 파일을 소스 코드 파일이라고합니다. 우리는 libcipher.a라는 라이브러리 파일을 만들 것입니다. 이 두 소스 코드 파일의 컴파일 된 버전이 포함됩니다. libcipher.h라는 짧은 텍스트 파일도 만듭니다. 새 라이브러리에있는 두 함수의 정의를 포함하는 헤더 파일입니다.

라이브러리와 헤더 파일을 가진 사람은 자신의 프로그램에서 두 기능을 사용할 수 있습니다. 그들은 바퀴를 다시 발명하고 기능을 다시 쓸 필요가 없습니다. 그들은 단지 우리 도서관의 사본을 이용합니다.

cipher_encode.c 및 cipher_decode.c 파일 컴파일

소스 코드 파일을 컴파일하기 위해 gcc표준 GNU 컴파일러 그만큼 -c (컴파일, 링크 없음) 옵션이 알려줍니다 gcc 파일을 컴파일 한 다음 중지합니다. 오브젝트 파일이라고하는 각 소스 코드 파일에서 중개 파일을 생성합니다. 그만큼 gcc 링커는 일반적으로 모든 개체 파일을 가져와 함께 연결하여 실행 가능한 프로그램을 만듭니다. 우리는 사용하여 그 단계를 건너 뜁니다 -c 선택권. 객체 파일 만 있으면됩니다.

우리가 생각하는 파일이 있는지 확인합시다.

ls -l

터미널 창에서 ls

이 디렉토리에는 두 개의 소스 코드 파일이 있습니다. 사용합시다 gcc 객체 파일로 컴파일합니다.

gcc -c cipher_encode.c
gcc -c cipher_decode.c

의 출력이 없어야합니다 gcc 모든게 잘되면.

터미널 창에서 gcc에서 출력

소스 코드 파일과 이름은 같지만 확장자가 “.o”인 두 개의 오브젝트 파일이 생성됩니다. 라이브러리 파일에 추가해야하는 파일입니다.

ls -l

터미널 창에서 ls -l의 출력

libcipher.a 라이브러리 생성

실제로 아카이브 파일 인 라이브러리 파일을 만들려면 ar.

우리는 -c 라이브러리 파일을 생성하는 (만들기) 옵션 -r (바꾸어 추가) 옵션을 사용하여 파일을 라이브러리 파일에 추가하고 -s 라이브러리 파일 내에 파일의 색인을 작성하는 (index) 옵션.

라이브러리 파일 libcipher.a를 호출 할 것입니다. 라이브러리에 추가 할 오브젝트 파일의 이름과 함께 해당 이름을 명령 행에 제공합니다.

ar -crs libcipher.a cipher_encode.o cipher_decode.o

ar -crs libcipher.a 터미널 창에서 cipher_encode.o cipher_decode.o

디렉토리에 파일을 나열하면 libcipher.a 파일이있는 것을 볼 수 있습니다.

ls -l

터미널 창에서 ls 출력

우리가 -t (테이블) 옵션 ar 라이브러리 파일 내부의 모듈을 볼 수 있습니다.

ar -t libcipher.a

터미널 창의 ar -t libcipher.a

libcipher.h 헤더 파일 작성

libcipher.h 파일은 libcipher.a 라이브러리를 사용하는 모든 프로그램에 포함됩니다. libcipher.h 파일에는 라이브러리에있는 함수의 정의가 포함되어야합니다.

헤더 파일을 만들려면 함수 정의를 gedit와 같은 텍스트 편집기에 입력해야합니다. 파일 이름을 “libcipher.h”로 지정하고 libcipher.a 파일과 동일한 디렉토리에 저장하십시오.

void cipher_encode(char *text);
void cipher_decode(char *text);

libcipher 라이브러리 사용

새 라이브러리를 테스트하는 유일한 방법은 사용하기 위해 작은 프로그램을 작성하는 것입니다. 먼저 test라는 디렉토리를 만듭니다.

mkdir test

라이브러리와 헤더 파일을 새 디렉토리에 복사합니다.

cp libcipher.* ./test

새 디렉토리로 변경하겠습니다.

cd test

두 파일이 있는지 확인합시다.

ls -l

터미널 창에서 cp libcipher. * ./test

라이브러리를 사용하고 예상대로 작동한다는 것을 증명할 수있는 작은 프로그램을 만들어야합니다. 편집기에 다음 텍스트 줄을 입력하십시오. 편집기의 내용을 “test.c”라는 파일에 저장하십시오. 테스트 예배 규칙서.

#include 
#include 

#include "libcipher.h"

int main(int argc, char *argv())
{
 char text()="How-To Geek loves Linux";

 puts(text);

 cipher_encode(text);
 puts(text);

 cipher_decode(text);
 puts(text);

 exit (0);

} // end of main

프로그램 흐름은 매우 간단합니다.

  • 라이브러리 함수 정의를 볼 수 있도록 libcipher.h 파일이 포함되어 있습니다.
  • “text”라는 문자열을 만들고“How-To Geek는 Linux를 좋아합니다”라는 단어를 저장합니다.
  • 해당 문자열을 화면에 인쇄합니다.
  • 그것은 전화 cipher_encode() 문자열을 인코딩하는 기능으로 인코딩 된 문자열을 화면에 인쇄합니다.
  • 전화 cipher_decode() 문자열을 디코딩하고 디코딩 된 문자열을 화면에 인쇄합니다.

생성하려면 test 프로그램에서 test.c 프로그램을 컴파일하고 라이브러리에 링크해야합니다. 그만큼 -o (출력) 옵션이 알려줍니다 gcc 생성 된 실행 프로그램을 호출 할 대상

gcc test.c libcipher.a -o test

터미널 창에서 gcc test.c libcipher.a -o 테스트

만약 gcc 자동으로 명령 프롬프트로 돌아 가면 모두 정상입니다. 이제 프로그램을 테스트 해 봅시다. 진실의 순간:

./test

터미널 창에서 ./test

그리고 우리는 예상되는 결과를 봅니다. 그만큼 test 프로그램은 일반 텍스트를 인쇄합니다. 암호화 된 텍스트를 인쇄 한 다음 해독 된 텍스트를 인쇄합니다. 새 라이브러리 내에서 함수를 사용하고 있습니다. 우리 도서관이 작동하고 있습니다.

터미널 창에서 테스트 프로그램의 출력

성공. 그런데 왜 거기서 멈춰?

라이브러리에 다른 모듈 추가

라이브러리에 다른 기능을 추가합시다. 프로그래머가 사용중인 라이브러리의 버전을 표시하는 데 사용할 수있는 기능을 추가합니다. 새 함수를 작성하고 컴파일 한 다음 기존 라이브러리 파일에 새 객체 파일을 추가해야합니다.

편집기에 다음 줄을 입력하십시오. 편집기의 내용을 cipher_version.c라는 파일에 저장하십시오. 도서관 예배 규칙서.

#include 

void cipher_version(void)
{
 puts("How-To Geek :: VERY INSECURE Cipher Library");
 puts("Version 0.0.1 Alphan");

} // end of cipher_version

새 함수의 정의를 libcipher.h 헤더 파일에 추가해야합니다. 해당 파일의 맨 아래에 다음과 같이 새 줄을 추가하십시오.

void cipher_encode(char *text);
void cipher_decode(char *text);
void cipher_version(void);

수정 된 libcipher.h 파일을 저장하십시오.

cipher_version.o 오브젝트 파일을 갖도록 cipher_version.c 파일을 컴파일해야합니다.

gcc -c cipher_version.c

터미널 창에서 gcc -c cipher_version.c

cipher_version.o 파일이 생성됩니다. 다음 명령을 사용하여 새 객체 파일을 libcipher.a 라이브러리에 추가 할 수 있습니다. 그만큼 -v (verbose) 옵션은 일반적으로 침묵합니다 ar 그것이 무엇을했는지 알려주십시오.

ar -rsv libcipher.a cipher_version.o

터미널 창의 ar -rsv libcipher.a cipher_version.o

새 객체 파일이 라이브러리 파일에 추가됩니다. ar 확인을 인쇄합니다. “a”는 “추가됨”을 의미합니다.

터미널 창에서 ar의 출력

우리는 사용할 수 있습니다 -t (테이블) 옵션은 라이브러리 파일에 어떤 모듈이 있는지 확인합니다.

ar -t libcipher.a

터미널 창의 ar -t libcipher.a

라이브러리 파일에는 세 개의 모듈이 있습니다. 새로운 기능을 활용합시다.

cipher_version () 함수 사용

테스트 디렉토리에서 이전 라이브러리와 헤더 파일을 제거하고 새 파일을 복사 한 다음 테스트 디렉토리로 다시 변경해 보겠습니다.

이전 버전의 파일을 삭제합니다.

rm ./test/libcipher.*

새 버전을 테스트 디렉토리에 복사합니다.

cp libcipher.* ./test

테스트 디렉토리로 변경하겠습니다.

cd test

터미널 창에서 rm ./test/libcipher.*

이제 새로운 라이브러리 함수를 사용하도록 test.c 프로그램을 수정할 수 있습니다.

test.c 프로그램에 새로운 줄을 추가해야합니다. cipher_version() 함수. 우리는 첫 번째 전에 이것을 배치합니다 puts(text); 선.

#include 
#include  

#include "libcipher.h" 

int main(int argc, char *argv()) 
{
 char text()="How-To Geek loves Linux"; 

 // new line added here
 cipher_version(); 

 puts(text); 
 
 cipher_encode(text); 
 puts(text); 
 
 cipher_decode(text); 
 puts(text); 

 exit (0); 

} // end of main

이것을 test.c로 저장하십시오. 이제이를 컴파일하고 새로운 기능이 작동하는지 테스트 할 수 있습니다.

gcc test.c libcipher.a -o test

터미널 창에서 gcc test.c libcipher.a -o 테스트

새 버전을 실행 해 봅시다 test:

터미널 창에서 테스트 프로그램의 출력

새로운 기능이 작동합니다. 출력 시작시 라이브러리 버전을 볼 수 있습니다. test.

그러나 문제가있을 수 있습니다.

라이브러리에서 모듈 교체

이것은 라이브러리의 첫 번째 버전이 아닙니다. 두 번째입니다. 버전 번호가 잘못되었습니다. 첫 번째 버전은 cipher_version() 그 안에 기능. 이거에요 따라서 이것은“0.0.2”버전이어야합니다. 우리는 교체해야합니다 cipher_version() 라이브러리의 기능이 수정되었습니다.

고맙게도 ar 매우 쉽게 할 수 있습니다.

먼저 cipher_version.c 파일을 도서관 예배 규칙서. “버전 0.0.1 알파”텍스트를 “버전 0.0.2 알파”로 변경하십시오. 다음과 같아야합니다.

#include 

void cipher_version(void)
{
 puts("How-To Geek :: VERY INSECURE Cipher Library");  
 puts("Version 0.0.2 Alphan"); 

} // end of cipher_version

이 파일을 저장하십시오. 새로운 cipher_version.o 객체 파일을 생성하기 위해 다시 컴파일해야합니다.

gcc -c cipher_version.c

터미널 창에서 gcc -c cipher_version.c

이제 우리는 바꾸다 새로 컴파일 된 버전의 라이브러리에있는 기존 cipher_version.o 객체

우리는 -r 라이브러리에 새 모듈을 추가하려면 (replace with add) 옵션을 추가하십시오. 라이브러리에 이미 존재하는 모듈과 함께 사용하면 ar 이전 버전을 새 버전으로 바꿉니다. 그만큼 -s (색인) 옵션은 라이브러리 색인과 -v (자세한) 옵션은 ar 그것이 무엇을했는지 알려주십시오.

ar -rsv libcipher.a cipher_version.o

터미널 창의 ar -rsv libcipher.a cipher_version.o

이 시간 ar cipher_version.o 모듈을 대체했다고보고합니다. “r”은 교체됨을 의미합니다.

터미널 창의 ar 출력

업데이트 된 cipher_version () 함수 사용

수정 된 라이브러리를 사용하고 작동하는지 확인해야합니다.

라이브러리 파일을 테스트 디렉토리에 복사합니다.

cp libcipher.* ./test

테스트 디렉토리로 변경하겠습니다.

cd ./test

새로운 라이브러리로 테스트 프로그램을 다시 컴파일해야합니다.

gcc test.c libcipher.a -o test

이제 프로그램을 테스트 할 수 있습니다.

./test

터미널 창에서 cp libcipher. * ./test

테스트 프로그램의 결과는 우리가 기대했던 것입니다. 버전 문자열에 올바른 버전 번호가 표시되고 암호화 및 암호 해독 루틴이 작동 중입니다.

라이브러리에서 모듈 삭제

결국 부끄러운 것 같지만 라이브러리 파일에서 cipher_version.o 파일을 삭제하겠습니다.

이를 위해 우리는 -d (삭제) 옵션. 우리는 또한 -v (자세한) 옵션을 사용하여 ar 그것이 한 일을 알려줍니다. 우리는 또한 -s 라이브러리 파일에서 색인을 업데이트하는 (index) 옵션.

ar -dsv libcipher.a cipher_version.o

터미널 창의 ar -dsv libcipher.a cipher_version.o

ar 모듈이 제거되었다고보고합니다. “d”는 “삭제됨”을 의미합니다.

우리가 묻는다면 ar 라이브러리 파일 내부의 모듈을 나열하기 위해 두 개의 모듈로 돌아 왔음을 알 수 있습니다.

ar -t libcipher.a

터미널 창의 ar -t libcipher.a

라이브러리에서 모듈을 삭제하려는 경우 라이브러리 헤더 파일에서 해당 정의를 제거해야합니다.

코드 공유

라이브러리는 실용적이지만 사적인 방식으로 코드를 공유 할 수있게합니다. 라이브러리 파일과 헤더 파일을 제공하는 사람은 누구나 라이브러리를 사용할 수 있지만 실제 소스 코드는 비공개로 유지됩니다.