Even though C isn't designed to support object-orient programming, it is still possible to write OOP in C (or more accurately - implement OOP concepts using C features).
One common way is by using structs as "objects" - Data Abstraction in C (@jacwah)
Look at the struct from the Linux kernel source below (from include/linux/virtio.h).
 * virtio_driver - operations for a virtio I/O driver
 * @driver: underlying device driver (populate name and owner).
 * @id_table: the ids serviced by this driver.
 * @feature_table: an array of feature numbers supported by this driver.
 * @feature_table_size: number of entries in the feature table array.
 * @probe: the function to call when a device is found.  Returns 0 or -errno.
 * @remove: the function to call when a device is removed.
 * @config_changed: optional function to call when the device configuration
 *    changes; may be called in interrupt context.
 */
struct virtio_driver {
        struct device_driver driver;
        const struct virtio_device_id *id_table;
        const unsigned int *feature_table;
        unsigned int feature_table_size;
        int (*probe)(struct virtio_device *dev);
        void (*scan)(struct virtio_device *dev);
        void (*remove)(struct virtio_device *dev);
        void (*config_changed)(struct virtio_device *dev);
#ifdef CONFIG_PM
        int (*freeze)(struct virtio_device *dev);
        int (*restore)(struct virtio_device *dev);
#endif
};
Another way is by naming conventions & correct usage of modules - http://rodrigomendez.me/writing-object-oriented-code-in-c/
Also look at (Referencing a book about the subject) -
How would one write object-oriented code in C?