I’m trying to build my own libpurple plugin in my nixos configuration, but I see it fails to load.
(18:57:22) plugins: probing /nix/store/mnx7hnfpdrjznvm38jidpp7wa9izm3br-pidgin-with-plugins-2.14.14/lib/purple-2/libpresage.so
(18:57:22) plugins: /nix/store/mnx7hnfpdrjznvm38jidpp7wa9izm3br-pidgin-with-plugins-2.14.14/lib/purple-2/libpresage.so is not loadable: cannot enable executable stack as shared object requires: Invalid argument
Apparently when I tried to build my own libpurple plugin for pidgin it fails, since it needs an executable stack or something.
My plugin’s definition is attached below.
{
fetchFromGitHub,
gcc,
glib,
lib,
pidgin,
protobuf,
qrencode,
rustPlatform,
sqlx-cli,
openssl,
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "purple-presage";
version = "0-unstable-2026-01-25";
src = fetchFromGitHub {
owner = "hoehermann";
repo = finalAttrs.pname;
rev = "3745f6366d535c082b71a0cf920ce546c0bae8b9";
hash = "sha256-mOCOGkZBZwxsCr6J3Ax7DrHHvpP6SGs1KmM8OOW5uo8=";
};
nativeBuildInputs = [
sqlx-cli
];
buildInputs = [
gcc
qrencode
pidgin
protobuf
openssl
];
PROTOC = "${protobuf}/bin/protoc";
strictDeps = true;
cargoBuildOptions = [ "--locked" "--offline" ];
cargoHash = "sha256-kogZM4IsZXly6OsNGKA0mHOJz2VXDXoTNp1hnlnRcIw=";
cargoRoot = "src/rust";
preBuild = ''
export DATABASE_URL="sqlite:$(mktemp --suffix ".sqlite3")"
(
cd "$(find ${finalAttrs.cargoDeps}/ -maxdepth 1 -type d -ipath '*/presage-store-*')"
sqlx database create
sqlx migrate run
)
cd ${finalAttrs.cargoRoot}
'';
#cmakeFlags = [ "-DCMAKE_PREFIX_PATH=${pidgin}" ];
postBuild = ''
aaa="$(find target -ipath '*/libpurple_presage_backend.a')"
gcc -DPLUGIN_VERSION=${finalAttrs.version} -fPIC -shared -Wl,-soname,libpresage.so -o libpresage.so -I../c -I. ../c/bridge.c ../c/connection.c ../c/qrcode.c ../c/receive_text.c ../c/send_text.c ../c/blist.c ../c/status.c ../c/groups.c ../c/receive_attachment.c ../c/send_file.c ../c/profile.c ../c/options.c ../c/attachment_common.c ../c/init.c -I${pidgin}/include/libpurple -lpurple -I${glib.dev}/include/glib-2.0 -I${glib.out}/lib/glib-2.0/include -lglib-2.0 $aaa -I${qrencode.dev}/include -lqrencode -lgcc_s -lutil -lrt -lpthread -ldl -lc -lm $NIX_CFLAGS_LINK -Wl,-z,noexecstack -lssl
'';
installPhase = ''
runHook preInstall
mkdir -p $out/lib/purple-2
cp libpresage.so $out/lib/purple-2
runHook postInstall
'';
extraRustcOpts = "-Z -lpurple";
doCheck = false;
verbose = true;
meta = {
homepage = "https://github.com/hoehermann/purple-presage";
description = "pidgin plugin for Signal in rust";
license = lib.licenses.gpl3Plus;
platforms = lib.platforms.unix;
};
})