diff --git a/samples/test_agc_imports/Makefile b/samples/test_agc_imports/Makefile
new file mode 100644
index 00000000..1a54f24a
--- /dev/null
+++ b/samples/test_agc_imports/Makefile
@@ -0,0 +1,48 @@
+# Copyright (C) 2023 John Törnblom
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not see
+# .
+
+PS5_HOST ?= ps5
+PS5_PORT ?= 9021
+
+ifdef PS5_PAYLOAD_SDK
+ include $(PS5_PAYLOAD_SDK)/toolchain/prospero.mk
+else
+ $(error PS5_PAYLOAD_SDK is undefined)
+endif
+
+ELF := test_agc_imports.elf
+
+CFLAGS := -Wall -Werror -g -lSceAgc -lSceAgcDriver
+
+all: $(ELF)
+
+$(ELF): main.c
+ $(CC) $(CFLAGS) -o $@ $^
+
+clean:
+ rm -f $(ELF)
+
+test: $(ELF)
+ $(PS5_DEPLOY) -h $(PS5_HOST) -p $(PS5_PORT) $^
+
+debug: $(ELF)
+ gdb-multiarch \
+ -ex "set architecture i386:x86-64" \
+ -ex "target extended-remote $(PS5_HOST):2159" \
+ -ex "file $(ELF)" \
+ -ex "remote put $(ELF) /data/$(ELF)" \
+ -ex "set remote exec-file /data/$(ELF)" \
+ -ex "start"
diff --git a/samples/test_agc_imports/main.c b/samples/test_agc_imports/main.c
new file mode 100644
index 00000000..63a453a7
--- /dev/null
+++ b/samples/test_agc_imports/main.c
@@ -0,0 +1,72 @@
+/* Copyright (C) 2026 Mihawk
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#include
+
+/* Only addresses are used here; this sample does not call these functions. */
+extern void sceAgcCbReleaseMem(void);
+extern void sceAgcCbSetShRegisterRangeDirect(void);
+extern void sceAgcCreateShader(void);
+extern void sceAgcDcbDrawIndex(void);
+extern void sceAgcDcbDrawIndexAuto(void);
+extern void sceAgcDcbSetCxRegistersIndirect(void);
+extern void sceAgcDcbSetFlip(void);
+extern void sceAgcDcbSetIndexBuffer(void);
+extern void sceAgcDcbSetIndexCount(void);
+extern void sceAgcDcbSetIndexSize(void);
+extern void sceAgcDcbSetNumInstances(void);
+extern void sceAgcDcbSetShRegistersIndirect(void);
+extern void sceAgcDcbSetUcRegistersIndirect(void);
+extern void sceAgcGetRegisterDefaults(void);
+extern void sceAgcInit(void);
+extern void sceAgcLinkShaders(void);
+extern void sceAgcSuspendPoint(void);
+extern void sceAgcDriverGetHsOffchipParam(void);
+extern void sceAgcDriverGetTFRing(void);
+extern void sceAgcDriverGetWaitRenderingPacketSizeInDwords(void);
+extern void sceAgcDriverSetHsOffchipParam(void);
+extern void sceAgcDriverSetTFRing(void);
+extern void sceAgcDriverSubmitDcb(void);
+extern void sceAgcDriverWaitUntilSafeForRendering(void);
+
+static const struct {
+ const char *name;
+ void (*address)(void);
+} imports[] = {
+ {"sceAgcCbReleaseMem", sceAgcCbReleaseMem},
+ {"sceAgcCbSetShRegisterRangeDirect", sceAgcCbSetShRegisterRangeDirect},
+ {"sceAgcCreateShader", sceAgcCreateShader},
+ {"sceAgcDcbDrawIndex", sceAgcDcbDrawIndex},
+ {"sceAgcDcbDrawIndexAuto", sceAgcDcbDrawIndexAuto},
+ {"sceAgcDcbSetCxRegistersIndirect", sceAgcDcbSetCxRegistersIndirect},
+ {"sceAgcDcbSetFlip", sceAgcDcbSetFlip},
+ {"sceAgcDcbSetIndexBuffer", sceAgcDcbSetIndexBuffer},
+ {"sceAgcDcbSetIndexCount", sceAgcDcbSetIndexCount},
+ {"sceAgcDcbSetIndexSize", sceAgcDcbSetIndexSize},
+ {"sceAgcDcbSetNumInstances", sceAgcDcbSetNumInstances},
+ {"sceAgcDcbSetShRegistersIndirect", sceAgcDcbSetShRegistersIndirect},
+ {"sceAgcDcbSetUcRegistersIndirect", sceAgcDcbSetUcRegistersIndirect},
+ {"sceAgcGetRegisterDefaults", sceAgcGetRegisterDefaults},
+ {"sceAgcInit", sceAgcInit},
+ {"sceAgcLinkShaders", sceAgcLinkShaders},
+ {"sceAgcSuspendPoint", sceAgcSuspendPoint},
+ {"sceAgcDriverGetHsOffchipParam", sceAgcDriverGetHsOffchipParam},
+ {"sceAgcDriverGetTFRing", sceAgcDriverGetTFRing},
+ {"sceAgcDriverGetWaitRenderingPacketSizeInDwords", sceAgcDriverGetWaitRenderingPacketSizeInDwords},
+ {"sceAgcDriverSetHsOffchipParam", sceAgcDriverSetHsOffchipParam},
+ {"sceAgcDriverSetTFRing", sceAgcDriverSetTFRing},
+ {"sceAgcDriverSubmitDcb", sceAgcDriverSubmitDcb},
+ {"sceAgcDriverWaitUntilSafeForRendering", sceAgcDriverWaitUntilSafeForRendering},
+};
+
+int
+main(void) {
+ for(unsigned i = 0; i < sizeof(imports) / sizeof(imports[0]); i++) {
+ printf("%s: %p\n", imports[i].name, (void *)imports[i].address);
+ if(!imports[i].address) {
+ return 1;
+ }
+ }
+ return 0;
+}
diff --git a/sce_stubs/libSceAgc.c b/sce_stubs/libSceAgc.c
new file mode 100644
index 00000000..6d54b4b5
--- /dev/null
+++ b/sce_stubs/libSceAgc.c
@@ -0,0 +1,73 @@
+/* Copyright (C) 2026 Mihawk
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+/* Link-time symbols only; implementations are provided by the system module. */
+
+asm(".global sceAgcCbReleaseMem\n"
+ ".type sceAgcCbReleaseMem @function\n"
+ "sceAgcCbReleaseMem:\n");
+
+asm(".global sceAgcCbSetShRegisterRangeDirect\n"
+ ".type sceAgcCbSetShRegisterRangeDirect @function\n"
+ "sceAgcCbSetShRegisterRangeDirect:\n");
+
+asm(".global sceAgcCreateShader\n"
+ ".type sceAgcCreateShader @function\n"
+ "sceAgcCreateShader:\n");
+
+asm(".global sceAgcDcbDrawIndex\n"
+ ".type sceAgcDcbDrawIndex @function\n"
+ "sceAgcDcbDrawIndex:\n");
+
+asm(".global sceAgcDcbDrawIndexAuto\n"
+ ".type sceAgcDcbDrawIndexAuto @function\n"
+ "sceAgcDcbDrawIndexAuto:\n");
+
+asm(".global sceAgcDcbSetCxRegistersIndirect\n"
+ ".type sceAgcDcbSetCxRegistersIndirect @function\n"
+ "sceAgcDcbSetCxRegistersIndirect:\n");
+
+asm(".global sceAgcDcbSetFlip\n"
+ ".type sceAgcDcbSetFlip @function\n"
+ "sceAgcDcbSetFlip:\n");
+
+asm(".global sceAgcDcbSetIndexBuffer\n"
+ ".type sceAgcDcbSetIndexBuffer @function\n"
+ "sceAgcDcbSetIndexBuffer:\n");
+
+asm(".global sceAgcDcbSetIndexCount\n"
+ ".type sceAgcDcbSetIndexCount @function\n"
+ "sceAgcDcbSetIndexCount:\n");
+
+asm(".global sceAgcDcbSetIndexSize\n"
+ ".type sceAgcDcbSetIndexSize @function\n"
+ "sceAgcDcbSetIndexSize:\n");
+
+asm(".global sceAgcDcbSetNumInstances\n"
+ ".type sceAgcDcbSetNumInstances @function\n"
+ "sceAgcDcbSetNumInstances:\n");
+
+asm(".global sceAgcDcbSetShRegistersIndirect\n"
+ ".type sceAgcDcbSetShRegistersIndirect @function\n"
+ "sceAgcDcbSetShRegistersIndirect:\n");
+
+asm(".global sceAgcDcbSetUcRegistersIndirect\n"
+ ".type sceAgcDcbSetUcRegistersIndirect @function\n"
+ "sceAgcDcbSetUcRegistersIndirect:\n");
+
+asm(".global sceAgcGetRegisterDefaults\n"
+ ".type sceAgcGetRegisterDefaults @function\n"
+ "sceAgcGetRegisterDefaults:\n");
+
+asm(".global sceAgcInit\n"
+ ".type sceAgcInit @function\n"
+ "sceAgcInit:\n");
+
+asm(".global sceAgcLinkShaders\n"
+ ".type sceAgcLinkShaders @function\n"
+ "sceAgcLinkShaders:\n");
+
+asm(".global sceAgcSuspendPoint\n"
+ ".type sceAgcSuspendPoint @function\n"
+ "sceAgcSuspendPoint:\n");
diff --git a/sce_stubs/libSceAgcDriver.c b/sce_stubs/libSceAgcDriver.c
new file mode 100644
index 00000000..fdc42992
--- /dev/null
+++ b/sce_stubs/libSceAgcDriver.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2026 Mihawk
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+/* Link-time symbols only; implementations are provided by the system module. */
+
+asm(".global sceAgcDriverGetHsOffchipParam\n"
+ ".type sceAgcDriverGetHsOffchipParam @function\n"
+ "sceAgcDriverGetHsOffchipParam:\n");
+
+asm(".global sceAgcDriverGetTFRing\n"
+ ".type sceAgcDriverGetTFRing @function\n"
+ "sceAgcDriverGetTFRing:\n");
+
+asm(".global sceAgcDriverGetWaitRenderingPacketSizeInDwords\n"
+ ".type sceAgcDriverGetWaitRenderingPacketSizeInDwords @function\n"
+ "sceAgcDriverGetWaitRenderingPacketSizeInDwords:\n");
+
+asm(".global sceAgcDriverSetHsOffchipParam\n"
+ ".type sceAgcDriverSetHsOffchipParam @function\n"
+ "sceAgcDriverSetHsOffchipParam:\n");
+
+asm(".global sceAgcDriverSetTFRing\n"
+ ".type sceAgcDriverSetTFRing @function\n"
+ "sceAgcDriverSetTFRing:\n");
+
+asm(".global sceAgcDriverSubmitDcb\n"
+ ".type sceAgcDriverSubmitDcb @function\n"
+ "sceAgcDriverSubmitDcb:\n");
+
+asm(".global sceAgcDriverWaitUntilSafeForRendering\n"
+ ".type sceAgcDriverWaitUntilSafeForRendering @function\n"
+ "sceAgcDriverWaitUntilSafeForRendering:\n");