summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFreeArtMan <dos21h@gmail.com>2022-08-24 16:33:43 +0100
committerFreeArtMan <dos21h@gmail.com>2022-08-24 16:33:43 +0100
commit07304d7e1135009cb7073a9bcc295168ba9675b3 (patch)
tree755ead89274efd13a6aafab2f7962269c0336f06
parent500b4a4903ac2d4a999617c1c8d74d240df41739 (diff)
downloadmd-content-07304d7e1135009cb7073a9bcc295168ba9675b3.tar.gz
md-content-07304d7e1135009cb7073a9bcc295168ba9675b3.zip
Added embeding notes
-rw-r--r--md/notes/undefined_c/titles.md196
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