Holland, 30, went 7-9 with a 4.95 ERA over 107 1/3 innings in 22 games (20 starts) with the Texas Rangers in 2016.
Holland, who can earn an additional $2 million by reaching certain incentives, has missed significant time the past three seasons because of injuries.
The 6-foot-2, 215-pound Holland opened the season in the starting rotation, going 3-1 with a 2.48 ERA in April before being placed on the disabled list on June 22 with left shoulder inflammation.
Holland became a free agent when the Rangers declined their $11 million option on his contract and instead chose to pay him a $1.5 million buyout.
“Derek gives a veteran, left-handed presence for our starting rotation with a proven track record of pitching well in big games,” White Sox general manager Rick Hahn said in a statement. “This move provides us with additional depth and flexibility in the rotation.”
In eight major league seasons, all with the Rangers, Holland has gone 62-50 with a 4.35 ERA in 179 games (158 starts).
Holland’s best season came in 2011 when he went 16-5 with a 3.95 ERA in 32 starts. He set career bests in 2013 with a 3.42 ERA, 33 starts, 213 innings pitched and 189 strikeouts.
Holland pitched in 14 career postseason games (five starts), going 3-1 with a 5.02 ERA. He earned the victory in Game 4 of the 2011 World Series against St. Louis, limiting the Cardinals to two hits over 8 1/3 scoreless innings.
Holland originally was selected by the Rangers in the 25th round of the 2006 draft.
The White Sox also designated left-hander Matt Purke for assignment.
Purke, 26, spent most of the 2016 season with Triple-A Charlotte, posting a 3.52 ERA over 38 1/3 innings in 26 appearances (one start). He also made his major league debut with the White Sox, going 0-1 with a 5.50 ERA over 18 innings in 12 relief appearances.