In addition to using the -Os small model there are other options that can be added to the Makefile to reduce code further, if they are not already in the Makefile.
This is example from my own Makefile, the variables CFLAGS and LDFLAGS are likely to have different names in your Makefile.
# Add
# "-Os -ffunction-sections -fdata-sections"
# to the compiler section of the Makefile, plus
# "--gc-sections"
# to the linker section of the Makefile. This will ensure that the
# code is optimized for smallest size, and that unused code and data
# are removed.
# "-u symbol,main"
# Pretend the symbol symbol is undefined, to force linking of library
# modules to define it. "-u" can be used multiple times with different
# symbols to force loading of additional library modules.
CFLAGS += -ffunction-sections -fdata-sections
LDFLAGS += -Wl,-gc-sections,-u,main
# Things such as Interrupt routines and some start up code may need to
# be marked with an 'used' attribute, to keep needed code from being
# removed. Look at the .map and .sym files.
# The official GCC list of command line options:
# https://gcc.gnu.org/onlinedocs/gcc/Option-Index.html