Don’t mistake topics with transforms, even though transform data is actually transmitted via a topic (or pair of topics, actually).
It’s robot_state_publisher that does what you’re asking about. Here’s what robot_state_publisher does, basically:
- It reads the given text file passed to it by the launch file. This is often a xacro file that was preprocessed by the program ‘xacro’ (a macro processor for XML files) to create an XML text file that has certain preprocessor variables replaced. 
- It finds the ‘robot’ element within the text file. Within that it:
- Finds all the ‘material’ elements.
- Finds all the ‘link elements’.
- Finds all the ‘joint’ elements. For each joint, it:
- Picks up the paren link name.
- Picks up the child link name.
- If there is no parent link name, it recognizes it as the single, root node of the directed, acyclic graph (DAG) forming the URDF tree.
- It creates a publisher for the topic ‘robot_description’ and publishes the text file it was handed by the launch file.
- It creates a subscriber to the “joint_states” topic. When it receives a new message (from, say, the joint_state_publisher node), it publishes a corresponding dynamic tf message. This, of course, usually occurs for your joints that don’t have the type ‘fixed’, like your wheel joints that typically have the type ‘continuous’.
- It creates a publisher for the static transforms. These are are the joints that have the type ‘fixed’. It publishes those static tf transforms just once.
So, any information about ‘base_link’ as a ‘link’ is contained in the ‘robot_description’ topic which can be read by, e.g., rviz2, to display the physical model.
Any fixed ‘joints’ are published once as tf transforms via the  'tf_static' topic.
Any non-fixed ‘joints’ are published as tf transforms over the ’tf’ topic as new joint_state messages are received, usual from the joint_state_publisher node (although you can also publish that data from other means, such via a GUI when you are experimenting setting up a robot).
Base_link has two meanings, as do many things in a URDF. There is base_link as a ‘link’ which describes a physical model. It just sits in a text message, published to the ‘robot_description’ topic. It happens to be in the XML format. Nodes that want to see base_link as cylinders, boxes, etc. and part of a DAG (directed, acyclic graph) read the ‘robot_description’ topic, parse it as an XML file, but their own tree form and do what they want with it, such as show it as a 3D model or use it to compute collision boundaries.
Base_link is also the name of a frame, which part of the tree of ‘frames’ used in ROS. Frames, or joints  are published as tf messages via either the tf or tf_static topics. Joints are just a connection between two frames and a transform just indicates the pose of one frame relative to another frame.
The topic ’tf_static’ is usually published once by the robot_state_publisher node. It only needs to be published once because, well, it’s static. The relationship between static frames (joints of type ‘fixed’) cannot ever change over time.
The topic ’tf’ is published as dynamic state changes for joints, especially as wheels move or servos move. 
tf_static can also be published via a static transform node publisher in a launch file, or by code you write, etc.
tf can also be published by nodes that monitor sensors or actuators (motors), if the relationship of some frame changes with respect to some other frame. If you have a robot arm that moves, someone has to publish a tf message to update the new position of all the parts of that arm relative to other links.