diff options
| -rw-r--r-- | md/notes/undefined_c/titles.md | 196 | 
1 files changed, 190 insertions, 6 deletions
diff --git a/md/notes/undefined_c/titles.md b/md/notes/undefined_c/titles.md index 4e7361e..18fcdec 100644 --- a/md/notes/undefined_c/titles.md +++ b/md/notes/undefined_c/titles.md @@ -1,4 +1,4 @@ -title:Undefine C  +title:Undefined C   keywords:c,linux,asm   # Undefined C @@ -1426,30 +1426,209 @@ undefined_b.c:5:14: runtime error: division by zero  fish: Job 1, './undefined_b' terminated by signal SIGFPE (Floating point exception)  ``` - +<!--  ### FARMA-C - +--->  ### Write plugins - -  ### Preload library  ## Embedding C +Most of the programming languages support embeding C. As C language have where simple +functiong naming when its mangled to object format it makes it easy target when  +linking with other languages. Most of other languages have incompatible naming for +functions when compiled to binary.  +  ### Embed in C++ + +__lib.h__ +```c +#include <stdlib.h> +#include <stdio.h> + +int fun_secret_1(); +``` + +__lib.c__ +```c +#include "lib.h" + +int fun_secret_1() { +	printf("Hello from C\n"); +	return -1; +} +``` + +First thing to notice is when file is compiled with C++ is that the name of the function are in different format +then when its compiled with C.  +``` +$ g++ -c lib.c +$ readelf -s lib.o +Symbol table '.symtab' contains 6 entries: +   Num:    Value          Size Type    Bind   Vis      Ndx Name +     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND  +     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS lib.c +     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 .text +     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 .rodata +     4: 0000000000000000    26 FUNC    GLOBAL DEFAULT    1 _Z12fun_secret_1v +     5: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND puts + +``` + +Lets tell C++ that file is C language by adding **extern "c"** + +__lib.h__ +```c +#include <stdlib.h> +#include <stdio.h> + +extern "C" { + +int fun_secret_1(); + +} +``` + +__lib.c__ +```c +#include "lib.h" + +extern "C" { + +int fun_secret_1() { +	printf("Hello from C\n"); +	return -1; +} + +} +``` + +Now compiled object file have C function names.  + +``` +$ g++ lib.c -c +$ readelf -s lib.o + +Symbol table '.symtab' contains 6 entries: +   Num:    Value          Size Type    Bind   Vis      Ndx Name +     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND  +     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS lib.c +     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 .text +     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 .rodata +     4: 0000000000000000    26 FUNC    GLOBAL DEFAULT    1 fun_secret_1 +     5: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND puts + +``` + +__cppembed.cpp___ +```cpp +#include "lib.h" + +int main() { +	fun_secret_1(); +} +``` + +Doing oposite way running C++ from C   +[/writeup/wraping_c_plus_plus_exceptions_templates_and_classes_in_c.md](/writeup/wraping_c_plus_plus_exceptions_templates_and_classes_in_c.md) +  ### Embed in Go + +__lib.h__ +```c +#include <stdlib.h> +#include <stdio.h> + +int fun_secret_1(); +``` +__lib.c__ +```c +#include "lib.h" + +int fun_secret_1() { +	printf("Hello from C\n"); +	return -1; +} +``` + +__main.go__ +```go +package main +// #cgo CFLAGS: -g -Wall +// #include <stdlib.h> +// #include "lib.h" +import "C" +import ( +	"fmt" +	 +) +func main() { +	fmt.Println("Start program") +	C.fun_secret_1() +	fmt.Println("End program") +} +``` + +``` +go build +``` + +[https://karthikkaranth.me/blog/calling-c-code-from-go/](https://karthikkaranth.me/blog/calling-c-code-from-go/) + +  ### Embed in Swift -### Embed in JS + +[/writeup/linux_hello_world_in_swift.md](/writeup/linux_hello_world_in_swift.md) + +### Embed in Rust + +__lib.c__ +```c +#include <stdio.h> +#include <stdlib.h> + +int fun_secret_1() { +	printf("Hello from C\n"); +	return -1; +} +``` + +```rust +extern "C" { +	fn fun_secret_1(); +} + +//rustc main.rs -o hello +fn main() { +	println!("Start program"); +	unsafe {fun_secret_1()} +	println!("End program"); +} +``` + +Compile with + +``` +gcc -c lib.c +gcc -shared lib.o -o liblib.so +rustc main.rs -l lib -L . -o hello -C link-arg="-Wl,-rpath=./" +``` + +[https://dev.to/xphoniex/how-to-call-c-code-from-rust-56do](https://dev.to/xphoniex/how-to-call-c-code-from-rust-56do)  ### Lua in C + +[/writeup/embedding_lua_in_c.md](/writeup/embedding_lua_in_c.md)   +  ### Python in C +  ## Multiplatform  ### Cross compile @@ -1459,6 +1638,11 @@ fish: Job 1, './undefined_b' terminated by signal SIGFPE (Floating point excepti  ### AVR8  ### Emscripten +[/writeup/web_assembly_sdl_example.md](/writeup/web_assembly_sdl_example.md) + +#### Embed in JS + +  ## Graphics  | 
