__attribute__((visibility(""))) 매크로를 활용하면 라이브러리 내에 구현된 함수를 라이브러리 외부에서 호출할 수 있을지 여부를 결정할 수 있다. 라이브러리 내 함수를 구현할 때, 아래와 같이 __attribute__((visibility("default"))) 속성을 부여하면 해당 함수가 라이브러리 외부에 노출되어, 해당 함수를 라이브러리 외부에서 호출할 수 있다. 즉, 라이브러리를 링크하는 어플리케이션에서 해당 함수를 호출할 수 있다. void __attribute__((visibility("default"))) do_something() { ... } 반대로, 아래와 같이 __attribute__((visibility("hidden"))) 속성을 부여하면 해당 함수가 라이브러리..
현상 프로그램 빌드 시 다음과 같은 에러가 발생하는 경우가 있습니다. 이는 링크 에러로써, 각 mp_* 함수를 찾을 수 없다는 의미입니다. undefined reference to `mp_prime_is_prime' undefined reference to `mp_sqrmod' undefined reference to `mp_lcm' undefined reference to `mp_gcd' undefined reference to `mp_mod_d' undefined reference to `mp_toradix' undefined reference to `mp_set_int' undefined reference to `mp_get_int' undefined reference to `mp_get_int' ..
현상 프로그램 실행 중 다음과 같은 에러가 발생하며 프로그램이 종료되는 경우가 있습니다. free(): invalid size Aborted 원인 이는 메모리 관련 에러가 발생했음을 나타냅니다. 다음 중 하나의 문제일 수 있습니다. 할당되지 않은 메모리 포인터를 해제(free())하고자 하는 경우 이미 해제된 메모리 포인터를 다시 해제하고자 하는 경우 위와 같이 코드를 작성하지 않았음에도 이러한 현상이 발생하는 경우, 버퍼 오버플로우가 발생했거나 써서는 안 될 메모리에 무언가를 써서 heap corruption이 발생했을 수 있습니다. 해결 방안 디버거 등을 사용하여 에러 발생 시점에 프로그램이 무엇을 하고 있었는지 확인해 봅니다. 해당 시점에서 문제점을 찾지 못할 경우, 그보다 이전 시점 어딘가에서 문..
현상 프로그램 빌드 시 다음과 같은 에러가 발생하는 경우가 있습니다. 이는 링크 에러로써, log10f 함수를 찾을 수 없다는 의미입니다. undefined reference to log10f 해결 방법 "-lm" 옵션으로 math 라이브러리를 링크해 주면 해결됩니다.
OBJECT IDENTIFIER 데이터 유형은 0x06의 값을 갖는 Tag 값으로 시작되는 TLV 형태로 인코딩됩니다. Object Identifier(OID) 내에서 각 점으로 구분되는 각 정수(=노드)는 다음 규칙에 따라 인코딩됩니다. OID의 첫 두 노드는 1 바이트로 함께 인코딩됩니다. 첫번째 노드에 40을 곱한 값에 두번째 노드의 값을 더합니다. 127 이하의 노드 값은 1 바이트로 인코딩됩니다. 128 이상의 노드 값은 다수의 바이트로 인코딩됩니다. leftmost 바이트의 Bit 7이 1로 인코딩되며, 각 바이트의 Bit 0~6에 인코딩된 값이 포함됩니다. 다음은 인증서 요청(Certificate request) 메시지 내에 포함된 ClientId를 인코딩하는 예제입니다. 1.3.6.1.4...
C 프로그래밍 : 두 GPS 좌표간 목적지 방위각(bearing) 계산하기 본 글에서는 C 언어를 이용하여 하나의 GPS 좌표에서 다른 GPS 좌표로의 목적지 방위각(bearing)을 계산하는 방법에 대해 설명한다. GPS 좌표 중 도 단위 위도(latitude) 값과 경도(longitude) 값을 이용하여 특정 좌표로부터 또 다른 좌표로의 목적지 방위각(bearing)을 계산할 수 있다. 목적지 방위각(bearing)은 "특정 객체의 진행방향과 또다른 객체 사이의 각도" 또는 "정북(True North)와 타겟좌표 사이의 각도"를 의미하며, 본 글에서의 의미는 후자이다. 본 방법에서는 계산을 위해 삼각함수가 사용되므로 math 헤더파일을 인클루드해야 한다. 목적지 방위각(bearing)을 구한는 함수는..
C 프로그래밍 : 두 GPS 좌표간 거리(distance) 구하기 본 글에서는 C 언어를 이용하여 두 GPS 좌표간의 거리를 구하는 방법에 대해 설명한다. GPS 좌표 정보 중 도 단위 위도(latitude) 값과 경도(longitude) 값을 이용하여 두 좌표 사이의 거리(distance)를 계산할 수 있다. 본 방법에서는 거리 계산을 위해 삼각함수가 사용되므로 math 헤더파일을 인클루드해야 한다. 두 좌표 간 거리를 구하는 함수는 다음과 같이 구현할 수 있다. #include /// 계산에 사용되는 파이 값 #define PI 3.14159265358979323846 /** * @brief 소수점 도(decimal degree)를 라디언(radian)으로 변환한다. * @param[in] deg 변..
본 글에서는 문자열 형태로 표현된 네트워크 인터페이스 MAC 주소를 6바이트 길이의 바이트열로 변환하는 방법에 대해 설명한다. 이더넷 네트워크 인터페이스의 MAC 주소는 6바이트의 길이를 가지며, 보통 다음과 같이 표현된다. 리눅스 계열 운영체제 : 00:01:02:03:04:05 윈도우즈 운영체제 : 00-01-02-03-04-05 MAC 주소가 위와 같은 형태의 문자열로 표현되어 있을 때(예: "00:01:02:03:04:05"), 이 문자열을 6바이트 길이의 바이트열로 변환하는 간단한 함수를 다음과 같이 구현할 수 있다. #include #include #include /// MAC 주소 길이 #define MAC_ALEN 6 /// MAC 주소 문자열 길이 #define MAC_ADDR_STR_L..
본 글에서는 네트워크 인터페이스의 MAC 주소 바이트열을 출력하는 구문을 간소화할 수 있는 매크로에 대해 소개한다. 보통 MAC 주소를 출력하고자 하는 경우 printf 문을 다음과 같은 형태로 작성할 수 있는데, 이 때 6 바이트 길이를 갖는 MAC 주소의 각 바이트를 출력하기 위해 작성 구문이 길어지게 된다. 출력 구문을 처음부터 끝까지 직접 작성하거나 복사-붙여넣기 후 수정할 수도 있는데, 둘 모두 편안하지는 않다. printf("MAC address - %02X:%02X:%02X:%02X:%02X:%02X\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); 다음과 같이 매크로를 정의하여 출력 구문을 간소화 시킬 수가 있다. #include #i..
본 글에서는 배열에 담긴 바이트열 데이터를 16진수 형식으로 출력(Hex dump)하는 함수를 소개한다. 본 함수는 다양한 형태의 바이트열 데이터(예: 네트워크 패킷 데이터)에 담긴 내부 정보를 로그로 출력하여 디버깅하는 용도로 많이 활용된다. 본 함수를 실행하면, 다음 그림처럼 리눅스에서 xxd 명령을 통해 출력되는 형태와 유사하게 출력된다. 좌측에는 오프셋 값, 중앙에는 Hex dump 값, 우측에는 ASCII 코드 값이 출력된다. 다음은 Hex dump 출력 함수 전문이다. #include #include /** * 버퍼에 담긴 데이터에 대한 Hex dump 를 출력한다. 우측에 아스키 값도 함께 출력한다. * * @param[in] data 출력할 데이터가 담긴 배열 * @param[in] len..
본 글에서는 16진수 문자열을 바이트열로 변환하는 함수를 소개한다. 예를 들어, "FE303321" 과 같이 16진수를 표현하는 8바이트 길이의 문자열을 array[4] = { 0xFE, 0x30, 0x33, 0x21 } 과 같은 4바이트 배열로 변환하는 함수이다. #include #include #include /** * 16진수 문자열을 바이트열로 변환한다. * @param[in] hex_str 16진수 문자열 (예: fe80000000000000024954fffe454b01) * @param[out] array 변환된 바이트열이 저장될 버퍼 * @return 변환된 바이트열의 길이 */ size_t ConvertHexStrToArray(const char *hex_str, uint8_t *array..
소프트웨어를 개발할 때, 소프트웨어의 동작이나 상태, 오류 등을 확인하기 위한 로그 출력 기능이 필요할 수 있다. 예를 들어, 가장 많이 사용되는 로그 출력은 printf() 함수를 이용한 화면 출력이며, 필요에 따라 파일에 저장하는 방식도 사용된다. 또한 동작 중 발생하는 이벤트의 종류나 우선순위(중요도)에 따라 로그의 레벨을 다르게 설정하고, 원하는 우선순위 이상의 로그만을 출력하는 기능도 필요할 수 있다. 본 글에서는 설정된 로그레벨 이상의 우선순위를 갖는 로그를 출력하는 함수를 구현하는 방법을 소개한다. 또한 필요에 따라 로그 출력문에 부가적인 정보를 추가하되, 매크로를 활용함으로써 함수 호출 형식 자체는 복잡하지 않게 구현하는 방법을 소개한다. 본 글에서 소개하는 로그 출력 함수는 다음과 같은 ..