Skip to content

Instantly share code, notes, and snippets.

@sandromello
Last active June 9, 2023 20:22
Show Gist options
  • Save sandromello/2daa7ed83882d31d9b82d1d84407912a to your computer and use it in GitHub Desktop.
Save sandromello/2daa7ed83882d31d9b82d1d84407912a to your computer and use it in GitHub Desktop.
Example how to load C lib from GO

Build the C Lib

go build -o agent.so -buildmode=c-shared main.go

Python

No dependencies required

cat - > agent.py <<EOF
#!/usr/bin/env python3

from ctypes import *
lib = cdll.LoadLibrary("./agent.so")
lib.Init()
EOF

HOOP_TOKEN=x-agt-7f17... python3 agent.py
{"level":"info","timestamp":"2023-06-09T12:42:11-03:00","logger":"agent/main.go:30","msg":"version=unknown, platform=darwin/arm64, mode=local, grpc_server=127.0.0.1:8010, tls=false - starting agent"}
{"level":"info","timestamp":"2023-06-09T12:42:11-03:00","logger":"agent/agent.go:158","msg":"connected with success to 127.0.0.1:8010, tls=false"}

Ruby

Depends of ffi module

gem install ffi
cat - > agent.rb <<EOF
require 'ffi'

module Agent
  extend FFI::Library
  ffi_lib './agent.so'
  attach_function :Init, [], :void
end

Agent.Init()
EOF

HOOP_TOKEN=x-agt-7f17... ruby agent.rb
{"level":"info","timestamp":"2023-06-09T13:37:12-03:00","logger":"agent/main.go:30","msg":"version=unknown, platform=darwin/arm64, mode=local, grpc_server=127.0.0.1:8010, tls=false - starting agent"}
{"level":"info","timestamp":"2023-06-09T13:37:12-03:00","logger":"agent/agent.go:158","msg":"connected with success to 127.0.0.1:8010, tls=false"}

Node

Depends of ffi-napi modules

npm install ffi-napi
# macos only!
cp agent.so agent.so.dylib

cat - > agent.js <<EOF
var ffi = require('ffi-napi');

var hoop = ffi.Library('./agent.so', {
  'Init': [ 'void', [] ]
});

console.log("starting agent from node")
hoop.Init()
EOF

HOOP_TOKEN=x-agt-7f17... node agent.js
starting agent from node
{"level":"info","timestamp":"2023-06-09T14:02:11-03:00","logger":"agent/main.go:30","msg":"version=unknown, platform=darwin/arm64, mode=local, grpc_server=127.0.0.1:8010, tls=false - starting agent"}
{"level":"info","timestamp":"2023-06-09T14:02:11-03:00","logger":"agent/agent.go:158","msg":"connected with success to 127.0.0.1:8010, tls=false"}

Java

Requires JNA

nix-shell -p zulu

cat - > Agent.java <<EOF
import com.sun.jna.*;
import java.util.*;
import java.lang.Long;

public class Agent {
  public interface Hoop extends Library {
    public void Init();
  }
  static public void main(String argv[]) {
    Hoop hoop = (Hoop) Native.loadLibrary(
      "./agent.so", Hoop.class);
    System.out.println("starting agent from java 11");
    hoop.Init();
  }
}
EOF

mkdir -p $HOME/.hoop/lib && cp agent.so $HOME/.hoop/lib/agent.so.dylib
curl -s -L https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar > jna-5.13.0.jar
JNA_JAR=$PWD/jna-5.13.0.jar
javac -cp $JNA_JAR Agent.java

DYLD_LIBRARY_PATH=$HOME/.hoop/lib LD_LIBRARY_PATH=$HOME/.hoop/lib HOOP_TOKEN=x-agt-7f17... java -cp ".:$JNA_JAR" Agent
starting agent from java 11
{"level":"info","timestamp":"2023-06-09T14:37:14-03:00","logger":"agent/main.go:30","msg":"version=unknown, platform=darwin/arm64, mode=local, grpc_server=127.0.0.1:8010, tls=false - starting agent"}
{"level":"info","timestamp":"2023-06-09T14:37:14-03:00","logger":"agent/agent.go:158","msg":"connected with success to 127.0.0.1:8010, tls=false"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment