Skip to content

Commit 449024d

Browse files
committed
shared_library abi
1 parent f20a408 commit 449024d

11 files changed

Lines changed: 92 additions & 0 deletions

File tree

‎shared_library/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
1. [Basic](basic/)
44
1. [Lib-lib dependency](lib_lib_dependency/)
55
1. [Symbol version](symbol_version/)
6+
1. [ABI](abi/)
67

78
Minimal example of a dynamic and static libraries.
89

‎shared_library/abi/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
https://stackoverflow.com/questions/2171177/what-is-an-application-binary-interface-abi/54967743#54967743

‎shared_library/abi/clean‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/usr/bin/env bash
2+
rm -rf v1/*.o v1/*.so v2/*.o v2/*.so *.out

‎shared_library/abi/main.c‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include <assert.h>
2+
#include <stdlib.h>
3+
4+
#include "mylib.h"
5+
6+
int main(void) {
7+
mylib_mystruct *myobject = mylib_init(1);
8+
assert(myobject->old_field == 1);
9+
free(myobject);
10+
return EXIT_SUCCESS;
11+
}

‎shared_library/abi/test‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env bash
2+
set -eu
3+
cc='gcc -pedantic-errors -std=c89 -Wall -Wextra'
4+
for d in v1 v2_bad v2_good; do
5+
$cc -fPIC -c -o "$d/mylib.o" "$d/mylib.c"
6+
$cc -L . -shared -o "$d/libmylib.so" "$d/mylib.o"
7+
done
8+
$cc -I v1 -L v1 -o main.out main.c -lmylib
9+
LD_LIBRARY_PATH=v1 ./main.out
10+
! LD_LIBRARY_PATH=v2_bad ./main.out
11+
LD_LIBRARY_PATH=v2_good ./main.out
12+
$cc -I v2_bad -L v2_bad -o main.out main.c -lmylib
13+
LD_LIBRARY_PATH=v2_bad ./main.out

‎shared_library/abi/v1/mylib.c‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include <stdlib.h>
2+
3+
#include "mylib.h"
4+
5+
mylib_mystruct* mylib_init(int old_field) {
6+
mylib_mystruct *myobject;
7+
myobject = malloc(sizeof(mylib_mystruct));
8+
myobject->old_field = old_field;
9+
return myobject;
10+
}

‎shared_library/abi/v1/mylib.h‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#ifndef MYLIB_H
2+
#define MYLIB_H
3+
4+
typedef struct {
5+
int old_field;
6+
} mylib_mystruct;
7+
8+
mylib_mystruct* mylib_init(int old_field);
9+
10+
#endif

‎shared_library/abi/v2_bad/mylib.c‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include <stdlib.h>
2+
3+
#include "mylib.h"
4+
5+
mylib_mystruct* mylib_init(int old_field) {
6+
mylib_mystruct *myobject;
7+
myobject = malloc(sizeof(mylib_mystruct));
8+
myobject->old_field = old_field;
9+
myobject->new_field = 2;
10+
return myobject;
11+
}

‎shared_library/abi/v2_bad/mylib.h‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#ifndef MYLIB_H
2+
#define MYLIB_H
3+
4+
typedef struct {
5+
int new_field;
6+
int old_field;
7+
} mylib_mystruct;
8+
9+
mylib_mystruct* mylib_init(int old_field);
10+
11+
#endif

‎shared_library/abi/v2_good/mylib.c‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include <stdlib.h>
2+
3+
#include "mylib.h"
4+
5+
mylib_mystruct* mylib_init(int old_field) {
6+
mylib_mystruct *myobject;
7+
myobject = malloc(sizeof(mylib_mystruct));
8+
myobject->old_field = old_field;
9+
myobject->new_field = 2;
10+
return myobject;
11+
}

0 commit comments

Comments
 (0)