It would be pretty silly to think that we didn't have objects before OOP.
OOP formalizes a notion of class, which allows arguably superior code organization. But these same constructs can be done in assembly or C. Further, tagged structures with switch statements also provide the equivalent functionality of classes, subclasses, and overrides, though considerably less formally.
The 68k-based Macintosh computers used a lot of assembly (in part as compilers just weren't as good 40 years ago).
We have always had a way to group fields together into an object.
FORTRAN '66 — notably lacking a formal construct of structure or record — programmers would simply use parallel arrays where the separate arrays held the various fields of interest, and same index position in each separate array constituted an object.
There's always (and always been) some way to compose fields into an object, to relate one object to another, to substitute one object for another, to handle one object differently than another.
struct
. Git is also written in C. Purely functional programming languages don't have OO, not in the sense you are speaking about.