diff --git a/subprojects/gst-plugins-good/sys/v4l2/gstv4l2object.c b/subprojects/gst-plugins-good/sys/v4l2/gstv4l2object.c
index 288ff74477..5b7f455124 100644
--- a/subprojects/gst-plugins-good/sys/v4l2/gstv4l2object.c
+++ b/subprojects/gst-plugins-good/sys/v4l2/gstv4l2object.c
@@ -528,6 +528,23 @@ v4l2_mmap_wrapper (gpointer start, gsize length, gint prot, gint flags, gint fd,
 #define v4l2_mmap v4l2_mmap_wrapper
 
 #endif /* SIZEOF_OFF_T < 8 */
+
+#if defined(__linux__) && !defined(__GLIBC__)
+/* v4l2_ioctl always takes request as unsigned long int, not ioctl_req_t */
+static gint
+v4l2_ioctl_wrapper (gint fd, ioctl_req_t request, ...)
+{
+  void *arg;
+  va_list ap;
+
+  va_start (ap, request);
+  arg = va_arg (ap, void *);
+  va_end (ap);
+
+  return v4l2_ioctl (fd, request, arg);
+}
+#endif /* defined(__linux__) && !defined(__GLIBC__) */
+
 #endif /* HAVE_LIBV4L2 */
 
 GstV4l2Object *
@@ -578,7 +595,11 @@ gst_v4l2_object_new (GstElement * element,
     v4l2object->fd_open = v4l2_fd_open;
     v4l2object->close = v4l2_close;
     v4l2object->dup = v4l2_dup;
+#ifdef __GLIBC__
     v4l2object->ioctl = v4l2_ioctl;
+#else
+    v4l2object->ioctl = v4l2_ioctl_wrapper;
+#endif
     v4l2object->read = v4l2_read;
     v4l2object->mmap = v4l2_mmap;
     v4l2object->munmap = v4l2_munmap;