李善长,字百室。元延祐元年(1314年)出生在凤阳府定远县(今安徽定远县)曲阳坊。自小有大志,也有心计,在乡里比较受人尊敬,曾被推为祭酒(古代飨宴时酹酒祭神的人)。他虽没有得过功名,但知书识礼,是地方上颇有名气的人。
至正十四年(1354年),当朱元璋南下进军滁州(今安徽滁县)经过定远县时,李善长告别了妻子姐弟,风尘仆仆赶往军门投见,从此他便留在朱元璋军内。
至正十五年(小明王宋龙凤元年,1355年)三月,郭子兴病逝,朱元璋代统郭部,以副都元帅镇守和州(今安徽和县)。当时元军力量仍很强盛,王子秃坚、枢密绊住等时常分营袭击朱元璋军。一次元军出袭鸡笼山寨,朱元璋决定亲自带兵反击,命令李善长带领少量兵力留守和州,嘱咐他如果敌至,只要坚守城池就行了。元军谍知和州兵力弱小,搞了突然袭击。其实李善长早有估计,并作了安排,在和州城周围设下伏兵。敌军一到,伏兵四起,打得元军落花流水。作为文人幕僚的李善长能在敌强我弱的情况下作战获胜,这是朱元璋没有料到的,因此闻捷分外欣喜,当场表扬李善长说:“怎么能说你仅仅是策谋划计的文人呢,你今天的胜利真叫执戈的武将也不得不佩服啊!”
元兵多次进攻,都被坚决顶住了,但军中却又闹起粮荒来。和州对岸是太平、芜湖,那里是有名的粮仓。而且太平东北可达集庆(今江苏南京),这个六朝古都既是江南第一大城,又处南北交通要冲,是个极其重要的军事战略要地。于是朱元璋与李善长计谋渡江,可是苦于无船和水兵。正在一筹莫展时,巢湖水寨首领俞通海、廖永忠等前来投靠,朱军得船千艘。六月初一,李善长紧随朱元璋左右,领水陆大军乘风破浪横渡长江。接着击破元大将蛮子海牙军的防守,占领芜湖,得到大批粮食,解决了部队的粮荒,继又直逼太平府。
李善长对本军习性了如指掌,揣摩这次胜利进城,将士们将会任意抢杀,因为才饱尝过粮荒威胁的滋味。李善长一向反对任意抢杀,他意识到纪律严明才能博得民心。于是向朱元璋提议及早采取措施。在这一问题上主辅之间是一拍即合的。朱元璋命李善长事先写好禁约:“不许虏掠,违令必按军法处置。”进城后四处张贴,还派人沿街巡察。遇到真有犯法的,当场立斩,毫不留情。太平百姓顿时安定。之后,朱元璋部队声名大振,附近百姓纷纷来归。朱元璋趁机顺流而下,于至正十六年(龙凤二年,1356年)三月攻占集庆。这一战役扩大了朱元璋的势力范围,使他建立了牢固的根据地,为全面胜利奠定了基础。朱元璋当即改集庆路为应天府。不久,朱元璋想乘胜前进,乃令徐达取镇江。当时部队连续得胜,士气有些骄盛,入城后抢夺掳掠时有发生。为整顿军纪,取信于民,李善长和朱元璋及率军攻镇江的统帅徐达密计,合演了一出戏,故意找徐达错处,朱元璋佯作盛怒,非绑了请王命牌处死刑不可,再由李善长出面调解,百般求情,才松了绑。不过,当场达成协定,以攻下城后不抢不杀为将功赎罪的条件。这出戏果真奏效。徐军取下镇江后,军纪严明,士卒肃然无人敢犯法。朱元璋的队伍不抢不杀深得民心。