리눅스에 링크 설정은 하드링크와 심볼링 링크 두 가지가 존재함
링크 사용에는 리눅스 파일 시스템의 자료구조 중 inode 정보에 대한 이해가 필요
파일을 생성하면, inode가 i-list 안에 기록되어 inode의 inumber와 파일 이름이 디렉토리에 등록됌
inode
정의 : Kernel이 관리하고 있는 파일을 위한 메타 데이터
사용자는 file 명을 가지고 파일을 액세스 하려고 하면, 내부적으로는 파일이름과 맵핑된 inode 번호로 맵핑된다.
inode가 가진 정보
1) 파일 모드(퍼미션)
2) 링크 수
3) 소유자명
4) 그룹명
5) 파일크기
6) 마지막 접근 정보
7) 마지막 수정 정보
8) 아이노드 수정 정보
하드링크
하드링크는 원본 파일의 inode의 위치를 가르킨다. 파일명만 다르지 사실상 하드링크, 원본파일을 구분할 수 없다.
(원본과 복사본의 차이가 없다)
왜냐하면 파일 시스템에 있는 데이터를 복사한 것이 아니라, inode 번호만 복사했기 때문이다. 따라서 실제 파일은 1개만 존재하는 셈이 된다.
윈도우 시스템에서 제공하는 바로가기 기능과 매우 유사.
원본 파일에 대한 정보가 포함되어 있지 않고, 원본 파일 위치에 대한 포인터만 포함한다. 즉 새로운 inode를 가진 링크파일이 생성된다.
user@linux:~/Desktop/elp/lab03_mylib$ make
gcc -g -Ilib -c -o hello.o hello.c
gcc -o hello hello.o -Llib -lmyfunc
방법)
gcc [옵션][파일명]
[옵션]
-c : 링크를 실행하지 않고, 컴파일와 어셈블리만 수행한다.
-o : 처음부터 끝까지 컴파일, 어셈블리, 링크를 수행 후, 실행파일을 만든다.
-v : gcc의 버전정보를 알 수 있다.
user@linux:~/Desktop/elp/lab03_mylib$ export LD_LIBRARY_PATH=${PWD}
1. user@linux:~/Desktop/elp/lab03_mylib$ sudo vim /etc/ld.so.conf
user@linux:~/Desktop/elp/lab03_mylib$ sudo cp lib/libmyfunc.so.1 /usr/lib
원본을 놔두고 여러가지 버전을 만들어서 쓸거임, 동적바인딩 될 hello를 위해 심볼릭 링크를 만든다.
1.
libmyfunc.so : (OBJS) $(CC) -shared -Wl,-soname,@.1 -o $@.1.0 $(OBJS)
ln -s $(TARGET).1.0 $(TARGET).1
ln -s $(TARGET).1 $(TARGET)
sudo cp $@ $@.1 $@.1.0 /usr/lib
공통적인 과정
1. make 실행 시 makefile에 맨 위 디폴트 타겟을 찾음
2. makeprog 발견
3. main.o로 감
4. main.c 수정 시간, 존재 유무 비교 후 컴파일 실행
5. 나머지 다 마찬가지
6. 컴파일 다 실행하고 링크 연결해서 makeprog 라는 실행파일 생성
type1:
makeprog: main.o func1.o func2.o
gcc -o makeprog main.o func1.o func2.o
main.o: main.c
gcc -c main.c
func1.o: func1.c
gcc -c func1.c
func2.o: func2.c
gcc -c func2.c
type2:
OBJECTS= main.o func1.o func2.o
TARGET= makeprog
makeprog: $(OBJECTS)
gcc -o $(TARGET) $(OBJECTS)
main.o: main.c
gcc -c main.c
func1.o: func1.c
gcc -c func1.c
func2.o: func2.c
gcc -c func2.c
clean:
rm -f $(TARGET) $(OBJECTS)
type3:
OBJECTS= main.o func1.o func2.o
TARGET= makeprog
CC= gcc
CFLAGS= -c
makeprog: $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
main.o: main.c
$(CC) $(CFLAGS) main.c
func1.o: func1.c
$(CC) $(CFLAGS) func1.c
func2.o: func2.c
$(CC) $(CFLAGS) func2.c
clean:
rm -f $(TARGET) $(OBJECTS)
type4:
.SUFFIXES = .c .o
OBJECTS= main.o func1.o func2.o
SRCS= $(OBJECTS:.o=.c)
TARGET= makeprog
CC= gcc
CFLAGS= -g -c
$(TARGET): $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
.c.o :
$(CC) $(CFLAGS) $<
clean:
rm -f $(TARGET) $(OBJECTS) core
main.o: io.h main.c
func1.o: io.h func1.c
func2.o: io.h func2.c