Hermanverschooten

Hermanverschooten

Undefined symbol when using zigler and C file

This my first time using zig and zigler.

I am trying to use the embedded library for wireguard.
I have in the same folder, wireguard.h, wireguard.c and wireguard.ex.
The Wireguard module has

defmodule Wireguard do
  use Zig,
    otp_ap: :wg_man,
    c_src: [{"wireguard.c", ["-Wall"]}],
    include_dir: "."

  ~Z"""
  const std = @import("std");
  const crypto = std.crypto;
  const log = std.log.scoped(.wireguard);

  const wireguard = @cImport({
    @cInclude("wireguard.h");
  });

  pub fn list_devices() void {
    var deviceNames: [*c]u8 = null;
 
   deviceNames = wireguard.wg_list_device_names() orelse null;

    defer std.c.free(@ptrCast(?*anyopaque, deviceNames));

    if (deviceNames == null) {
        log.err("Unable to get device names", .{});
        return;
    }
  }
  """

When I try to mix compile, I get the following error:

== Compilation error in file lib/wireguard/wireguard.ex ==
** (MatchError) no match of right hand side value: ["error: ld.lld: undefined symbol: wg_list_device_names\n    note: referenced by .Elixir.Wireguard.zig:13 (/home/herman/Projects/wg_man/lib/wireguard/.Elixir.Wireguard.zig:13)\n    note:               /home/herman/.cache/zig/o/f3cd82336c77b73ffaead67d9007ba46/sema.o:(.Elixir.Wireguard.list_devices)"]
    (zigler 0.10.2) lib/zig/compile_error.ex:11: Zig.CompileError.to_error/2
    (zigler 0.10.2) lib/zig/sema.ex:88: Zig.Sema.run_sema!/3
    (zigler 0.10.2) lib/zig/compiler.ex:76: Zig.Compiler.compile/4
    (zigler 0.10.2) expanding macro: Zig.Compiler.__before_compile__/1
    lib/wireguard/wireguard.ex:1: Wireguard (module)

This function is defined in wireguard.c, so why is it not being found?
If I remove the body from the zig function it compiles and when I look at the exported functions in the generated Elixir.Wireguard.so I do find all the functions there.
I am probably missing something, but I have no clue where to start looking.

Marked As Solved

ityonemo

ityonemo

@Hermanverschooten should be fixed in 0.10.3, feel free to reopen bug report if it doesn’t work.

Also Liked

ityonemo

ityonemo

this is a bug in zigler. I think i know how to fix it, thanks for the report.

Hermanverschooten

Hermanverschooten

@ityonemo Yes! It works, thanks for the fantastic job!

Last Post!

Hermanverschooten

Hermanverschooten

@ityonemo Yes! It works, thanks for the fantastic job!

Where Next?

Popular in Questions Top

vegabook
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New
RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

Other popular topics Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44139 214
New

We're in Beta

About us Mission Statement